पुस्तक गेम कोडिंग कम्प्लीट, फोर्थ एडिशन , अध्याय 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;
}
}
इससे कुछ सवाल खड़े होते हैं।
पहला भाग बस ओएस (विंडोज) से पूछता है कि कितनी रैम उपलब्ध है। जिज्ञासु हिस्सा दूसरा है, जो स्मृति का एक बड़ा हिस्सा आवंटित करता है और इसे तुरंत मुक्त करता है:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
लेखक ने समझाया:
... यह फ़ंक्शन आवंटित करता है और तुरंत मेमोरी का एक बड़ा ब्लॉक जारी करता है। यह विंडोज को किसी भी कचरे को साफ करने का प्रभाव है जो मेमोरी मैनेजर में जमा हो गया है और दो-चेक करता है कि आप एक बड़े पैमाने पर ब्लॉक को आवंटित कर सकते हैं जितनी आपको ज़रूरत है। यदि कॉल सफल होता है, तो आप अनिवार्य रूप से अपने सिस्टम की मेमोरी के माध्यम से एक ज़म्बोनी मशीन के बराबर चलाते हैं, यह आपके गेम के लिए बर्फ को हिट करने के लिए तैयार हो रहा है ...
लेकिन उस पर मेरा आरक्षण है।
"सफाई कचरा जो स्मृति प्रबंधक में जमा हो गया है?" वास्तव में? यदि खेल अभी शुरू हुआ है, तो क्या कोई कचरा नहीं होना चाहिए?
"यह सुनिश्चित करना कि आप एक सन्निहित ब्लॉक आवंटित कर सकते हैं?" बहुत विशिष्ट मामले में जहां आप स्वयं मेमोरी का प्रबंधन करने जा रहे हैं, इससे उन्हें कुछ समझ में आएगा, लेकिन फिर भी, यदि आप बल्ले की बहुत सारी मेमोरी आवंटित करते हैं, तो आप किसी भी अन्य एप्लिकेशन को चलाने के लिए बहुत असंभव बनाते हैं जब आपका सिस्टम चालू है।
इसके अलावा, ओएस को उस सभी मेमोरी को करने के लिए मजबूर करने की संभावना नहीं है, और परिणाम के रूप में स्वैप डिस्क स्थान पर बहुत सारी मेमोरी का अनुमान लगाया जाता है, जिससे आपके ऐप स्टार्टअप बहुत धीमा हो जाता है?
क्या यह वास्तव में एक अच्छा अभ्यास है?
operator new
रहा है nullptr
), अगर आप मुझे अनुमति देते हैं कहना। सबसे अच्छी बात यह है कि आप इस पुस्तक के साथ अपनी चिमनी को हल्का कर सकते हैं। स्मृति के एक बड़े ब्लॉक को आवंटित और मुक्त करना स्मृति को "साफ" नहीं करता है ।
new
ऑपरेटर को फेंकने के बजाय अशक्त लौटने के लिए अधिभारित किया है bad_alloc
। यदि वे नहीं करते हैं, तो हाँ, यह कोड और भी अधिक निरर्थक है: P
operator delete
स्वीकार करने nullptr
और इसे नो-ऑप के रूप में मानने के लिए आवश्यक है । कोई भी वैश्विक अधिभार जो ऐसा नहीं करता है वह टूट गया है। इसका मतलब है कि यह किसी भी तरह से निरर्थक है। जैसे मान लेना कि स्मृति का एक बड़ा ब्लॉक आवंटित करना और इसे जारी करना "जादुई रूप से" कुछ अच्छा करेगा। सबसे अच्छा, यह कोई नुकसान नहीं करेगा (सबसे अधिक संभावना है, क्योंकि पृष्ठों को भी नहीं छुआ गया है ... अन्यथा यह आपके कामकाजी सेट से कुछ पृष्ठों को स्वैप कर सकता है जिन्हें आपको बाद में पुनः लोड करना होगा)।