繁体   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