2016-06-03 8 views
5

Sample 1을 컴파일 할 때 내 RAM을 모두 사용하면서 컴퓨터가 손상되는 이유는 무엇입니까? Sample 2 즉시 컴파일하지 않고 컴파일합니까?대용량의 객체 배열을 사용한 메모리 사용

샘플 1 :

class Foo 
{ 
    int a = 0; 
}; 

class Test 
{ 
    Foo foo[4000000] = {}; 
}; 

int main() 
{ 
    Test t; 
} 

샘플 2 :

class Foo 
{ 
    int a = 0; 
}; 

int main() 
{ 
    Foo foo[4000000] = {}; 
} 

마지막으로, 컴파일 할 때 RAM의 톤을 사용하는 샘플 1을 막을 수있는 방법은 무엇입니까? 나는 gcc version 5.3.0을 사용하고 있는데 위의 내용은 -std=c++11으로 컴파일되었습니다. class Test은 단지 16MB의 메모리 만 있으면됩니다.

모든 경우

+0

'그것은 내 모든 RAM을 사용하고 컴퓨터가 충돌합니다. 'GCC가 그렇게한다면 그것은 분명히 컴파일러 버그입니다. – user6412786

+0

매혹적인. gcc가'Test' 클래스에있는'Foo'의 4 백만 인스턴스 각각을 초기화하는 코드를 생성하여 객체의 생성자를 생성하려고 시도하고 있습니다. GCC가 두 번째 예제에서와 같은 방식으로이를 수행 할 수없는 이유는 무엇인지 모르겠습니다. 추신 'class test'는 16MB의 메모리, int 당 4 백만 * 4 바이트를 필요로합니다. –

+0

최적화되지 않은 코드를 생성 한 다음 최적화하는 것은 대단히 비합리적이지 않습니다. 분명히이 경우 극단적으로 차선책의 결과를 산출합니다. –

답변

-2

이것은 분명히 버그입니다. 내 시스템에 5.3으로 이것을 재현 할 수 있습니다. RAM 사용량이 급격히 증가하지만 시스템을 중단시키지 않기 때문에 프로그램을 종료했습니다. 반면에, Clang 3.8에서 컴파일하면 거의 즉시 컴파일됩니다.

gcc.gnu.org/bugzilla에 알려 주시기 바랍니다. indicated here 버그 보고서 59659, 68203 및 56671을 살펴보십시오. 저는 그들이 GCC의 무능함과 관련하여 많은 문제가 아닌 클래스 유형을 많이 보유하고 있음을 지적합니다.

+1

"이것은 분명히 버그입니다." 증명? –

+0

또한 기본적으로 [this] (http://stackoverflow.com/questions/37260097/stdarray-with-aggregate-initialization-on-g-generates-huge-code) 질문의 답변을 복사했습니다. 크레딧을 지불 할 곳을 알려주십시오. –