Книга Game Coding Complete, четвертое издание , глава 5 ( Инициализация и завершение игры ), раздел Проверка памяти, содержит этот интересный пример кода:
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;
}
}
Это поднимает некоторые вопросы.
Первая часть просто спрашивает ОС (Windows), сколько физической памяти доступно. Любопытная часть - вторая, которая выделяет огромный кусок памяти и освобождает ее сразу же:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
Автор продолжает объяснять:
... эта функция выделяет и немедленно освобождает огромный блок памяти. Это приводит к тому, что Windows очищает любой мусор, накопленный в диспетчере памяти, и дважды проверяет, можно ли выделять непрерывный блок по мере необходимости. Если вызов успешен, вы, по сути, запускаете эквивалент машины Zamboni через память вашей системы, готовя ее к тому, что ваша игра выйдет на лед ...
Но у меня есть оговорки на этот счет.
"Очистка мусора, накопившегося в диспетчере памяти?" В самом деле? Если игра только началась, разве не должно быть мусора?
"Убедитесь, что вы можете выделить непрерывный блок?" В очень конкретном случае, когда вы собираетесь управлять памятью самостоятельно, это имело бы какой-то смысл, но, тем не менее, если вы действительно выделяете много памяти прямо на летучей мыши, вы в значительной степени лишаете возможности запуска любого другого приложения система пока ваша включена.
Кроме того, разве это не заставит ОС выделять всю эту память и, как следствие, высвободить много памяти в пространство подкачки, что сильно замедлит запуск вашего приложения?
Это действительно хорошая практика?
operator new
для nullptr
), если вы позволите мне сказать. Лучшее, что вы можете сделать с этой книгой, это зажечь дымоход. Выделение и освобождение большого блока памяти, конечно , не «очищает» память.
new
оператор, чтобы возвращать ноль вместо броска bad_alloc
. Если они этого не сделали, то да, этот код еще более бессмысленный: P
operator delete
требуется принять nullptr
и рассматривать его как неоперативный. Любая глобальная перегрузка, которая не делает этого, сломана. Что означает, что это бессмысленно в любом случае. Точно так же, как предположение, что выделение огромного блока памяти и освобождение его «волшебным образом» принесут пользу. В лучшем случае это не принесет никакого вреда (скорее всего, поскольку страницы даже не затрагиваются ... в противном случае это может поменять некоторые страницы из вашего рабочего набора, которые вам необходимо будет перезагрузить позже).