Kitap Kodlama Oyun Komple, Dördüncü Baskı , bölüm 5 ( Oyun Başlatma ve Kapatma ), bölüm Denetleme Bellek bu ilginç kod örneğini içerir:
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;
}
}
Bu bazı soruları gündeme getiriyor.
İlk bölüm OS'ye (Windows) ne kadar fiziksel RAM'in mevcut olduğunu sorar. Meraklı kısım, büyük bir bellek parçası ayıran ve hemen boşaltan ikincisidir:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
Yazar açıklamaya devam ediyor:
... bu işlev büyük bir bellek bloğunu tahsis eder ve hemen serbest bırakır. Bu, Windows'un bellek yöneticisinde biriken çöpleri temizlemesini ve ihtiyacınız olduğu kadar bitişik bir blok ayırabileceğinizi iki kez kontrol etmesini sağlar. Çağrı başarılı olursa, esasen bir Zamboni makinesinin eşdeğerini sisteminizin hafızasında çalıştırırsınız ve oyununuzun buza çarpmasına hazır hale gelirsiniz ...
Ama bununla ilgili çekincelerim var.
"Bellek yöneticisinde biriken çöp temizleniyor mu?" Gerçekten mi? Eğer oyun yeni başlamışsa, hiç çöp olmamalı mı?
"Bitişik bir blok ayırabildiğinizden emin misiniz?" Belleği kendiniz yöneteceğiniz çok özel bir durumda, bu bir anlam ifade eder, ancak yine de, yarasanın çok fazla belleğini ayırırsanız, başka herhangi bir uygulamanın çalışmasını neredeyse imkansız hale getirirsiniz. sizinki açıkken sistem.
Ayrıca, bu işletim sistemini tüm bu belleği işlemeye zorlayacak ve sonuç olarak takas disk alanına çok fazla bellek çıkaracak ve uygulama başlangıcınızı çok yavaşlatacak mı?
Bu gerçekten iyi bir uygulama mı?
operator new
için nullptr
), beni izin verirse söylemek. Bu kitapla yapabileceğiniz en iyi şey bacalarınızı hafifletmektir. Ayırma ve tabii büyük bir hafızaya bloğunu azat etmez "temiz yukarı" bellek.
new
operatörü atmak yerine null döndürmek için aşırı yüklediklerinden şüpheliyim bad_alloc
. Eğer yapmadılarsa, evet, bu kod daha saçma: P
operator delete
kabul etmek nullptr
ve tedavi etmek gerekir. Bunu yapmayan herhangi bir genel aşırı yük bozuldu. Yani her iki durumda da saçma. Tıpkı büyük bir bellek bloğu tahsis etmenin ve onu serbest bırakmanın "sihirli bir şekilde" iyi bir şey yapacağını varsaymak gibi. En iyi ihtimalle, herhangi bir zarar vermez (büyük olasılıkla, sayfalara dokunulmadığından ... aksi takdirde daha sonra yeniden yüklemeniz gereken bazı sayfaları çalışma grubunuzdan çıkarabilir).