VC 内存大小获取的怪问题

z1zhangyanan 2007-11-30 11:52:23
MEMORYSTATUS mmsta;
mmsta.dwLength=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mmsta);

printf("Memory status:\n");
printf("---------------------------------------------\n");
printf("Total physical memory:\t\t%d\n",mmsta.dwTotalPhys);
printf("Phssical memory in use:\t\t%d%%\n",mmsta.dwMemoryLoad);
printf("Available physical memory:\t%d\n",mmsta.dwAvailPhys);
以上是小弟获取内存大小的代码,但是为什么和我在任务管理器——〉性能——〉物理内存中得到的数据不一样呢?太奇怪了,哪位大侠能帮忙解答一下呀?
...全文
261 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxinyou 2011-02-15
  • 打赏
  • 举报
回复
MEMORYSTATUS 函数中的参数 dwAvailPhys是32位的,你的机器是4G内存,所以溢出了,
建议使用GlobalMemoryStatusVlm()函数
z1zhangyanan 2007-12-05
  • 打赏
  • 举报
回复
嗯,好的,谢谢这位大哥。
怎么加分呀?我找不到加分的地方。
hljalong 2007-12-04
  • 打赏
  • 举报
回复
是很奇怪,我试过没出现你说的情况。
我觉得你可以建一个新工程,这个工程只作一件事,就是上面你贴出来的代码,看一下结果如何。
hljalong 2007-12-04
  • 打赏
  • 举报
回复
你显示出来的这个数:2147483647刚好是long的最大值0x7FFFFFFF,太奇怪了。
你的实际物理内存应该是4G才对。你最好用单步跟踪的方法,把得到的结构中的物理内存赋给一个unsigned long变量,看跟踪到这个赋值语句过后这个变量在内存中的值,就可知道是你显示时出的错,还是根本在结构中就不正确。
z1zhangyanan 2007-12-04
  • 打赏
  • 举报
回复
还是一样的结果。
#include "stdafx.h"
#include <windows.h>

int main(int argc, char* argv[])
{
MEMORYSTATUS memstatus;
memstatus.dwLength =sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&memstatus);
unsigned long mem=memstatus.dwAvailPhys;
unsigned long res=memstatus.dwAvailVirtual;
unsigned long totalphy=memstatus.dwTotalPhys;
unsigned long totalvir=memstatus.dwTotalVirtual;
printf("%ld\n",mem);

printf("%ld\n",res);

printf("%ld\n",totalphy);

printf("%ld\n",totalvir);

printf("Hello World!\n");
return 0;
}


难道是我的输出格式不对吗?unsigned long 类型输出要怎么输出?
gebifangjian 2007-11-30
  • 打赏
  • 举报
回复
用GlobalMemoryStatus(&mmsta)获取的是某运行时刻的内存状态,而任务管理器获取的是内存状态的实时数据
大熊猫侯佩 2007-11-30
  • 打赏
  • 举报
回复
你取得的 dwTotalPhys 值是多少?任务管理器中的 物理内存总数 又是多少?
z1zhangyanan 2007-11-30
  • 打赏
  • 举报
回复
我也试过了,不一样。不知道为什么。
hljalong 2007-11-30
  • 打赏
  • 举报
回复
你用mmsta.dwTotalPhys/1024试试。任务管理器中的是以K为单位的。
我试过了,用上面的值是一模一样的。
z1zhangyanan 2007-11-30
  • 打赏
  • 举报
回复
取出来是Bytes单位的,但
我的物理内存和可用内存都是2147483647字节,
而任务管理器里的物理内存是4193008K的。
大家快帮个忙吧,急!!!
飞哥 2007-11-30
  • 打赏
  • 举报
回复
张亚男?
这个我熟啊

我 wanfu.liu

该结构里面是字节,其中dwMemoryLoad是百分比


baoyz 2007-11-30
  • 打赏
  • 举报
回复
我试了一下,
fs << "percent of memory in use =" <<mmsta.dwMemoryLoad << endl;
fs << "bytes of physical memory =" << mmsta.dwTotalPhys/1024 << endl;
fs << "free physical memory bytes =" <<mmsta.dwAvailPhys/1024 << endl;
fs << "bytes of paging file =" <<mmsta.dwTotalPageFile/1024 <<endl;
fs << "free bytes of paging file =" <<mmsta.dwAvailPageFile/1024 <<endl;
fs << "user bytes of address space ="<<mmsta.dwTotalVirtual/1024 <<endl;
fs << "free user bytes ="<<mmsta.dwAvailVirtual/1024 <<endl;

结果
percent of memory in use =58(差不多)
bytes of physical memory =523760(对上了,单位是K)
free physical memory bytes =217908(差不多,单位是K)
bytes of paging file =1543268(1024M页面)
free bytes of paging file =1067460
user bytes of address space =2097024(怎么这么大?)
free user bytes =2061164(怎么这么大?)
MSDN里写的都是BYTES单位呀?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧