나는 큰 동적으로 할당 된 배열 (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)은 미친 것처럼 스왑하기 시작했다. 내가 무슨 말하는지 알지.
그런 다음 작업 관리자의 상황을 살펴보면 흥미로운 점을 발견했습니다. 디버그 모드에서는 할당이 즉시 이루어졌지만 릴리스에서는 점진적이었습니다.
디버그 모드 :
릴리스 모드 : 그 원인이 무엇
? 이것이 성능에 부정적인 영향을 줄 수 있습니까? 내가 잘못 했니? OS가이 문제를 일으켰습니까? 또는 C++ 할당 자?
끝없는 스와핑 루프가 아닌 메모리가 충분하지 않은 경우 실제로 예외가 발생하기를 선호합니다. 어떤 방법으로 그것을 C++에서 성취 할 수 있습니까?
Windows에서 스와핑 기능을 해제 할 수있는 해결책이 있다는 것을 알고 있지만 문제가 해결됩니다.
내가이이 DEBUG로 인해 발생 생각 C- 표준 라이브러리 코드를 사용하여 특정 디버그 정보를 할당 된 메모리에 저장함으로써 즉시 액세스하여 페이지 된 상태가되게합니다. 릴리스에서는 사용자가 액세스/사용 방법에 따라 점차적으로 메모리에 페이지 인 할 것입니다. – MicroVirus
나는 MicroVirus에 동의합니다. Windows 디버그 힙에 대한 자세한 내용은 [이 기사] (http://www.codeguru.com/cpp/wp/win32/tutorials/article.php/c9535/Inside-CRT-Debug-Heap-Management.htm)를 확인하십시오. 메타 데이터. – Manu343726
@MicroVirus 답변을 올리십시오 – imreal