หนังสือเกมการเข้ารหัสเสร็จสมบูรณ์ฉบับที่สี่บทที่ 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 ผ่านหน่วยความจำของระบบเพื่อเตรียมพร้อมสำหรับเกมของคุณที่จะโจมตีน้ำแข็ง ...
แต่ฉันมีการจองของฉันในที่
"กำลังทำความสะอาดขยะที่สะสมในตัวจัดการหน่วยความจำใช่ไหม" จริงๆ? หากเกมเพิ่งเริ่มต้นขึ้นไม่ควรมีขยะหรือไม่
"ทำให้แน่ใจว่าคุณสามารถจัดสรรบล็อกที่ต่อเนื่องกันได้หรือไม่" ในกรณีที่เฉพาะเจาะจงมากที่คุณจะจัดการหน่วยความจำด้วยตัวเองสิ่งนี้จะทำให้เกิดความรู้สึก แต่ถ้าคุณจัดสรรหน่วยความจำด้านขวาของไม้ตีจำนวนมากคุณจะทำให้มันเป็นไปไม่ได้ที่แอพพลิเคชันอื่นจะทำงาน ระบบขณะที่คุณเปิดอยู่
นอกจากนี้ยังไม่มีแนวโน้มที่จะบังคับให้ระบบปฏิบัติการใช้หน่วยความจำทั้งหมดนั้นและดังนั้นจึงมีการส่งหน่วยความจำจำนวนมากไปยังพื้นที่ดิสก์ swap ทำให้การเริ่มต้นแอปของคุณช้าลงมาก?
นี่เป็นวิธีปฏิบัติที่ดีจริง ๆ หรือไม่?
operator new
สำหรับnullptr
) ถ้าคุณอนุญาตให้ฉัน เพื่อพูด. สิ่งที่ดีที่สุดที่คุณสามารถทำได้กับหนังสือเล่มนี้คือปล่องไฟของคุณ แน่นอนว่าการจัดสรรและเพิ่มหน่วยความจำขนาดใหญ่นั้นไม่ใช่การล้างหน่วยความจำ
new
ผู้ประกอบการที่จะกลับ null bad_alloc
แทนการขว้างปา หากพวกเขาทำไม่ได้ใช่แล้วรหัสนี้ไร้สาระยิ่งกว่า: P
operator delete
ก็จำเป็นต้องยอมรับnullptr
และปฏิบัติต่อมันเป็นแบบไม่มี op การโอเวอร์โหลดทั่วโลกใด ๆ ที่ไม่ได้ทำนั้นเสียหาย ซึ่งหมายความว่ามันไร้สาระทั้งสองวิธี เช่นเดียวกับสมมติว่าการจัดสรรหน่วยความจำขนาดใหญ่และปล่อยมันจะ "น่าอัศจรรย์" ทำสิ่งที่ดี อย่างดีที่สุดมันจะไม่ทำอันตรายใด ๆ (น่าจะเป็นเพราะหน้าเว็บไม่ได้แตะเลย ... มิฉะนั้นมันอาจสลับหน้าบางส่วนจากชุดการทำงานของคุณซึ่งคุณจะต้องโหลดซ้ำในภายหลัง)