বই খেলা কোডিং সম্পূর্ণ, ফোর্থ এডিসন , অধ্যায় 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
। যদি তারা তা না করে তবে হ্যাঁ, এই কোডটি আরও
operator delete
তা গ্রহণ করা nullptr
এবং এটিকে কোনও বিকল্প হিসাবে বিবেচনা করা প্রয়োজন । যে কোনও বিশ্বব্যাপী ওভারলোড এটি করে না তা নষ্ট হয়ে গেছে। যার অর্থ এটি কোনওভাবেই অযৌক্তিক। যেমন ধরে নেওয়া যেমন মেমরির একটি বিশাল ব্লক বরাদ্দ করা এবং এটি প্রকাশ করা "জাদুকরভাবে" ভাল কিছু করবে। সর্বোপরি, এটি কোনও ক্ষতি করবে না (সম্ভবত, যেহেতু পৃষ্ঠাগুলি এমনকি স্পর্শও করা হয়নি ... অন্যথায় এটি আপনার কার্যকারী সেট থেকে কিছু পৃষ্ঠা সরিয়ে নিতে পারে যা আপনাকে পরে পুনরায় লোড করতে হবে)।