Book Game Coding Complete, Fourth Edition , chapter 5 ( Game Initialization and Shutdown ), Checking Memory 섹션 에는이 흥미로운 코드 샘플이 포함되어 있습니다.
bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);
if (status.ullTotalPhys < physicalRAMNeeded)
{
// you don’t have enough physical memory. Tell the player to go get a
// real computer and give this one to his mother.
GCC_ERROR("CheckMemory Failure: Not enough physical memory.");
return false;
}
// Check for enough free memory.
if (status.ullAvailVirtual < virtualRAMNeeded)
{
// you don’t have enough virtual memory available.
// Tell the player to shut down the copy of Visual Studio running in the
// background, or whatever seems to be sucking the memory dry.
GCC_ERROR("CheckMemory Failure: Not enough virtual memory.");
return false;
}
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
else
{
// even though there is enough memory, it isn't available in one
// block, which can be critical for games that manage their own memory
GCC_ERROR("CheckMemory Failure: Not enough contiguous memory.");
return false;
}
}
이것은 몇 가지 질문을 제기합니다.
첫 번째 부분은 OS (Windows)에 사용 가능한 물리적 RAM의 양을 묻습니다. 흥미로운 부분은 두 번째 부분으로, 엄청난 양의 메모리를 할당하고 즉시 해제합니다.
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
저자는 다음과 같이 설명합니다.
...이 함수는 거대한 메모리 블록을 할당하고 즉시 해제합니다. 이렇게하면 메모리 관리자에 누적 된 가비지를 Windows에서 정리하고 필요한만큼 연속 블록을 할당 할 수 있는지 다시 확인하는 효과가 있습니다. 전화가 성공하면 기본적으로 시스템 메모리를 통해 잠보니 머신과 동등한 기능을 실행하여 게임이 얼음에 부딪 칠 수 있도록 준비합니다.
그러나 나는 그것에 대한 나의 예약이있다.
"메모리 관리자에 쌓인 가비지 청소?" 정말? 게임이 방금 시작된 경우 쓰레기가 없어야합니까?
"연속 블록을 할당 할 수 있는지 확인 하시겠습니까?" 메모리를 직접 관리하려는 매우 구체적인 경우에는 이것이 의미가 있지만 여전히 많은 양의 메모리를 할당하면 다른 응용 프로그램을 실행할 수 없게됩니다. 당신이 켜져있는 동안 시스템.
또한 이것이 OS가 모든 메모리를 커밋하여 스왑 디스크 공간에 많은 메모리를 제거하여 앱 시작 속도를 크게 떨어 뜨리지 않을 가능성이 있습니까?
이것이 실제로 좋은 습관입니까?
operator new
위한을 nullptr
), 당신은 저를 허용하는 경우 말을 그 책으로 할 수있는 가장 좋은 일은 굴뚝을 가볍게하는 것입니다. 물론 큰 메모리 블록을 할당하고 해제 해도 메모리가 "정리" 되지 않습니다 .
new
연산자가 오버로드되어 null 대신 null을 반환하도록 의심했습니다 bad_alloc
. 그렇지 않다면,이 코드는 훨씬 더 무의미합니다. : P
operator delete
받아들이고 nullptr
취급해야합니다. 이를 수행하지 않는 전역 과부하가 발생했습니다. 어느 쪽이든 말도 안되는 의미입니다. 거대한 메모리 블록을 할당하고 해제한다고 가정하면 "마 법적으로"좋은 일을 할 것입니다. 기껏해야 아무런 해를 끼치 지 않습니다 (페이지를 건드리지 않았기 때문에 가능성이 높습니다 ... 그렇지 않으면 나중에 다시로드 해야하는 작업 세트에서 일부 페이지가 바뀔 수 있습니다).