2012-04-16 4 views
0

모두 내 프로그램에 메모리 문제가있을 수 있으므로 다양한 도구에서 제공하는 메모리 사용에 대한 정보를 찾으려고합니다. 원인을 찾기 위해 간단한 실험도합니다. 릴리스 모드에서, 나는 다음과 같은 코드, 코드가 실행momory가 할당되면 작업 관리자의 실제 메모리가 변경되지 않습니다.

pChar = new char[((1<<30)/2)]; 
for(int i; i < ((1<<30)/2); i++) 
{ 
    pChar[i] = i % 256; 
} 

를 추가, Windows 작업 관리자에서 사용 가능한 실제 메모리는 변경되지 않습니다. 필자의 견해로는 컴파일러가 코드를 제거하여 성능을 향상시킬 수 있습니다. 변수를 하나의 전역 변수로 선언합니다. 작동하지 않습니다. 그러나 디버그 모드에서는 Windows 작업 관리자의 사용 가능한 실제 메모리가 예상대로 변경됩니다. 나는 그것을 이해할 수 없다.

다른 질문이 있습니다. 실제 메모리가 부족한 경우 새 작업에서 가상 메모리의 메모리를 할당합니다. 아니면 하나의 예외가 throw됩니까?

답변

0

실제로 컴파일러가 "쓰기 전용"변수를 감지 할 가능성이 있습니다. 비 volatile이므로 쓰기 작업을 안전하게 제거 할 수 있으므로 OS가 실제로 RAM을 할당 할 필요가 없습니다.

new은 최신 시스템에 주소 공간 만 할당합니다. 실제 RAM은 필요할 때 할당됩니다. 일반적으로 이것은 ctor가 실행될 때 멤버가 초기화 될 때 발생합니다. 그러나 new char에는 물론 ctor가 없습니다.

+0

감사합니다. 메모리가 가상 메모리에 할당되면 프로그램이 느리게 실행됩니까? 결정은 컴파일러 또는 운영 체제에 의해 만들어진 것입니까? –

+0

모든 할당은 가상 메모리를 대상으로하므로 "가상 메모리가 부족할 경우"라는 질문은 의미가 없으므로 결정을 내릴 수 없습니다. RAM은 나중에 OS에 의해 할당 될 때 할당되며 필요에 따라 할당됩니다. – MSalters