2013-08-29 3 views
0

나는 boost :: msm 프레임 워크를 기반으로하는 템플릿을 사용하는 코드를 컴파일 중이다. g ++ 4.7.1로 컴파일하면 cc1plus 프로세스가 약 2.4Gb의 RAM 크기에 도달하고 "가상 메모리가 부족합니다 : 메모리를 할당 할 수 없습니다"라는 오류로 실패합니다.g ++ 4.7.1에서 컴파일시 가상 메모리 제한이 적용됩니까?

32 비트 컴파일러 (64 비트로 전환하는 것은 ATM이 아닙니다)를 사용하고 있으며, 기계 자체는 16Gb의 RAM이있는 64 비트 우분투이며 컴파일은 64 비트 chroot에서 수행됩니다. 데비안 wheezy 배포판. 컴파일 할 때 충분한 RAM이 있으므로 물리적으로 사용 가능한 RAM이 없기 때문에 컴파일이 실패하면 먼저 4Gb에 도달해야합니다. 나는 "ulimit -m"옵션으로 다른 값으로 설정하고 더 작은 크기로 설정하여 컴파일러가 일찍 실패하도록하지만 "무제한"으로 남겨지면 위의 2 + Gb에서 실패합니다.

그래서 뭔가 다른 것 같아요. 아마도 비슷한 문제가 발생하여 한계를 변경하는 방법을 알고있을 것입니다.

+0

"64 비트로 전환"은 GCC 자체의 64 비트 빌드를 사용하거나 GCC를 사용하여 64 비트 실행 파일을 빌드하는 것을 의미합니까? – MSalters

+0

64 비트 g ++ 사용을 의미합니다 – Kikosha

답변

2

컴파일러를 포함하여 32 비트 응용 프로그램에서 일반적으로 가상 공간의 usermode에 사용할 수있는 2 ~ 3GB 사이가됩니다. 이는 예약 된 메모리 공간, 메모리 공간 조각화 (사용 가능한 가상 메모리가 있으며 new 또는 malloc이 요청하는 크기 블록을 보유하기에 충분한 크기의 청크가 아님) 및 프로세스가있는 "메모리 예약"의 조합으로 인해 발생합니다 꽤 많은 양의 메모리가 할당되었지만 실제로는 모든 메모리를 사용하지 않으므로 "채워지지 않았습니다".

-M32을 사용하여 64 비트 GCC를 사용하여 32 비트 코드를 생성 할 수없는 특별한 이유가 있습니까? 그게 내 해결책이 될거야.

+0

귀하의 설명은 실제 관찰 결과에 매우 적합합니다. 실제 크기는 다양합니다. 나는 32 비트 코드를 생성하기 위해 64 비트 GCC를 사용하거나 컴파일 크기를 줄이기 위해 다른 기술을 사용하여 무게를 줄 것이다. – Kikosha

+0

64 비트에서 동일한 버전의 gcc를 사용하는 경우 동일한 코드가 생성되어야한다. 32 비트 빌드 (64 비트 바이너리를 빌드하기 위해 32 비트 GCC를 사용했습니다. 64 비트 OS가 초기 단계에 있었기 때문에 컴파일러를 사용하여 64 비트 바이너리를 완성 할 수 없었습니다. OS의 비트 버전!) –

관련 문제