Cuốn sách Hoàn thành mã hóa trò chơi, Phiên bản thứ tư , chương 5 ( Khởi tạo và tắt máy trò chơi ), phần Kiểm tra bộ nhớ chứa mẫu mã thú vị này:
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;
}
}
Điều này đặt ra một số câu hỏi.
Phần đầu tiên chỉ hỏi HĐH (Windows) có bao nhiêu RAM vật lý. Phần gây tò mò là phần thứ hai, phân bổ một khối lớn bộ nhớ và giải phóng nó ngay lập tức:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
Tác giả tiếp tục giải thích:
... chức năng này phân bổ và ngay lập tức giải phóng một khối bộ nhớ khổng lồ. Điều này có tác dụng làm cho Windows dọn sạch mọi rác rưởi tích lũy trong trình quản lý bộ nhớ và kiểm tra hai lần để bạn có thể phân bổ một khối liền kề lớn như bạn cần. Nếu cuộc gọi thành công, về cơ bản, bạn đã chạy tương đương với máy Zamboni thông qua bộ nhớ hệ thống của bạn, để sẵn sàng cho trò chơi của bạn chạm vào ...
Nhưng tôi có đặt phòng của tôi về điều đó.
"Làm sạch rác đã tích lũy trong trình quản lý bộ nhớ?" Có thật không? Nếu trò chơi vừa mới bắt đầu, không nên có rác?
"Đảm bảo rằng bạn có thể phân bổ một khối liền kề?" Trong trường hợp rất cụ thể mà bạn sẽ tự mình quản lý bộ nhớ, điều này sẽ có ý nghĩa, nhưng vẫn vậy, nếu bạn phân bổ nhiều bộ nhớ cho con dơi, bạn sẽ không thể chạy bất kỳ ứng dụng nào khác. hệ thống trong khi bạn đang bật.
Ngoài ra, điều này có khả năng buộc HĐH phải cam kết tất cả bộ nhớ đó hay không, và do đó, sẽ khiến rất nhiều bộ nhớ vào không gian đĩa trao đổi, làm chậm quá trình khởi động ứng dụng của bạn rất nhiều?
Đây thực sự là một thực hành tốt?
operator new
cho nullptr
), nếu bạn cho phép tôi để nói. Điều tốt nhất bạn có thể làm với cuốn sách đó là thắp sáng ống khói của bạn. Phân bổ và giải phóng một khối lớn bộ nhớ tất nhiên không "dọn sạch" bộ nhớ.
new
nhà điều hành toàn cầu để trả về null thay vì ném bad_alloc
. Nếu họ không, thì có, mã này thậm chí còn vô nghĩa hơn: P
operator delete
được yêu cầu chấp nhận nullptr
và coi nó là không-op. Bất kỳ quá tải toàn cầu không làm điều đó là bị hỏng. Điều đó có nghĩa là nó vô nghĩa theo một trong hai cách. Cũng giống như giả định rằng việc phân bổ một khối lớn bộ nhớ và giải phóng nó sẽ "kỳ diệu" làm điều gì đó tốt. Tốt nhất, nó sẽ không gây hại gì (rất có thể, vì các trang thậm chí không được chạm vào ... nếu không nó có thể hoán đổi một số trang từ bộ công việc của bạn mà bạn sẽ cần tải lại sau).