Книга кодування ігор завершена, четверте видання , глава 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
оператора, щоб повернути null замість того, щоб кидати bad_alloc
. Якщо вони цього не зробили, то так, цей код ще більш безглуздий: P
operator delete
потрібно прийняти nullptr
та ставитись до нього як до неоперативного. Будь-яка глобальна перевантаження, яка цього не робить, порушена. Що означає, що це безглуздо. Так само, як припускати, що виділення величезного блоку пам’яті та звільнення його «магічно» принесуть щось хороше. У кращому випадку це не принесе шкоди (швидше за все, оскільки сторінки навіть не торкаються ... інакше це може змінити деякі сторінки з вашого робочого набору, які вам потрібно буде перезавантажити пізніше).