2014-01-28 1 views
4

나는 큰 동적으로 할당 된 배열 (C++, MSVC110)가, 나는 이런 식으로 초기화하고 : I가 시도하기 전에동적 메모리 할당은 릴리스 모드에서 디버그 인스턴트하지만 점진적으로 보인다

try { 
    size_t arrayLength = 1 << 28; 
    data = new int[arrayLength]; 
    for (size_t i = 0; i < arrayLength; ++i) { 
     data[i] = rand(); 
    } 
} 
catch (std::bad_alloc&) { /* Report error. */ } 

모든 것이 괜찮다고 시스템의 실제 RAM보다 10GB 이상 할당하십시오. 나는 bad_alloc 예외를 잡기를 기대하고 있었지만, 시스템 (Win7)은 미친 것처럼 스왑하기 시작했다. 내가 무슨 말하는지 알지.

그런 다음 작업 관리자의 상황을 살펴보면 흥미로운 점을 발견했습니다. 디버그 모드에서는 할당이 즉시 이루어졌지만 릴리스에서는 점진적이었습니다.

디버그 모드 :

Debug mode allocation graph

릴리스 모드 : 그 원인이 무엇

Release mode allocation graph

? 이것이 성능에 부정적인 영향을 줄 수 있습니까? 내가 잘못 했니? OS가이 문제를 일으켰습니까? 또는 C++ 할당 자?

끝없는 스와핑 루프가 아닌 메모리가 충분하지 않은 경우 실제로 예외가 발생하기를 선호합니다. 어떤 방법으로 그것을 C++에서 성취 할 수 있습니까?

Windows에서 스와핑 기능을 해제 할 수있는 해결책이 있다는 것을 알고 있지만 문제가 해결됩니다.

+6

내가이이 DEBUG로 인해 발생 생각 C- 표준 라이브러리 코드를 사용하여 특정 디버그 정보를 할당 된 메모리에 저장함으로써 즉시 액세스하여 페이지 된 상태가되게합니다. 릴리스에서는 사용자가 액세스/사용 방법에 따라 점차적으로 메모리에 페이지 인 할 것입니다. – MicroVirus

+1

나는 MicroVirus에 동의합니다. Windows 디버그 힙에 대한 자세한 내용은 [이 기사] (http://www.codeguru.com/cpp/wp/win32/tutorials/article.php/c9535/Inside-CRT-Debug-Heap-Management.htm)를 확인하십시오. 메타 데이터. – Manu343726

+0

@MicroVirus 답변을 올리십시오 – imreal

답변

2

메모리 할당자가 메모리 처리 오류를보다 잘 탐지 할 수 있도록 디버깅 모드에서 일부 체인을 수행하고 있다고 생각합니다. 할당 된 모든 블록에 액세스하여 각각에 몇 바이트를 쓰게되므로 시스템이 모든 페이지를 신속하게 커밋해야합니다.

릴리스 모드에서 블록을 선형으로 채우는 코드이므로 한 번에 한 페이지 씩 커밋합니다.

메모리 양을 제한하는 것과 마찬가지로, 사용 가능한 리소스에 대해 알려주는 시스템 호출이 필요합니다. These, for instance, in Windows environment.

메모리 saw이 필요한 경우 시스템 호출에 실패하면 주어진 프로그램이 제어 할 수없는 상황 (시작된 다른 응용 프로그램과 같은 경우)으로 인해 사용 가능한 메모리 양이 지속적으로 변경되므로 이해가되지 않습니다.

일부 메모리 블록을 교체 할 수 없도록 만들 수 있지만 (RAM에 잠겨 있음), 일반적으로 드라이버와 같은 시스템 계층에만 사용이 제한됩니다.

사용 가능한 메모리를 감지하고 할당 제한을 적용하는 것은 사용자의 책임입니다.

위험한 게임임을 유의하십시오. 일반적으로 컴퓨터에서 단독으로 실행되지 않기 때문에 나중에 다른 응용 프로그램이 시작되고 더 많은 메모리를 사용하는지 알 수 없습니다.

스왑이 응용 프로그램에 대한 킬러 인 경우, 당신은 안전 마진을 복용 고려해야한다 (즉,이 500MB 또는 시스템에 사용 가능한 RAM 1GB의 같은 것을 떠나려고)

+0

새 메모리 블록이 0xCDCDCDCD로 채워져 초기화되지 않은 힙 메모리임을 알립니다. – drescherjm

+0

http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – drescherjm

+0

@drescherjm 그렇습니다.하지만 그 전에는 할당자가 다른 액세스를한다고 의심합니다. 그렇지 않으면 릴리스 버전과 동일한 결과를 관찰해야합니다. –