簡體   English   中英

GlobalMemoryStatusEx()(Win32)

[英]GlobalMemoryStatusEx() (Win32)

MSDN中GlobalMemoryStatusEx()的描述說:

GlobalMemoryStatusEx函數返回的信息是易失的。 無法保證對此函數的兩次連續調用將返回相同的信息。

此函數返回的一條信息是“以字節為單位的總物理內存”。 (這與可用的免費物理內存量不同,MEMORYSTATUSEX結構中還有另一個成員。)

每次運行程序時,總物理內存如何變化? 我將值輸出到文本文件並獲得以下結果:

55872198592
55837267904
8589934605
55835301824
55848146880
55849064384
55849129920
55836743616
8589934605
8589934605
8589934605
8589934605
55835105216

我有4GB的系統RAM。 如果我在64位操作系統上,是否需要調用另一個API函數?

這是代碼:

#include <Windows.h>
#include <string>
#include <sstream>
#include "Game.h"
#include <fstream>

void Game::CheckMemory(DWORDLONG& a)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);

a = status.ullTotalPhys;

std::stringstream ss;

ss << "Total Physical Memory: " << status.ullTotalPhys << "bytes." << std::endl;

MessageBoxA(NULL, ss.str().c_str(), "Mem Summary", 0);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
{
DWORDLONG a;
Game g;
g.CheckMemory(a);

std::fstream fs("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

fs << a << std::endl;

fs.close();

return 0;
}

在調用函數之前,必須初始化MEMORYSTATUSEXdwLength成員。

MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);

在對結構做任何事情之前,你應該檢查它的返回值。

如msdn幫助中所述:您可以使用GlobalMemoryStatusEx函數來確定應用程序可以分配多少內存,而不會嚴重影響其他應用程序。

GlobalMemoryStatusEx函數返回的信息是易失的。 無法保證對此函數的兩次連續調用將返回相同的信息。

lpBuffer的MEMORYSTATUSEX結構的ullAvailPhys成員包括所有NUMA節點的內存。

所以在不同的電話中返回值可能不同,這是正確的答案。

你確定輸出了正確的字段嗎? 你列出的第一個數字大約是55 GB,如果你只有4GB的ram,那就沒什么意義了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM