gpt4 book ai didi

c++ - 无法使用 GetProcessMemoryInfo 测量静态数组内存使用情况

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:56 26 4
gpt4 key购买 nike

我正在尝试了解有关内存使用情况的详细信息,以及如何使用 C++ 对其进行测量。我知道在 Windows 下,当包含 <Windows.h> 时,有一种快速检索当前应用程序进程使用的 RAM 量的方法。 , 是:

PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
(uint64_t)info.WorkingSetSize;

然后,我用它来运行一个非常简单的测试:

#include <iostream>
#include <Windows.h>"

int main(void)
{
uint64_t currentUsedRAM(0);

PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;

const int N(1000000);
int x[N]; //in the second run, comment this line out
int y[N]; //in the second run, comment this line out
//int *x = new int[N]; //in the second run UNcomment this line out
//int *y = new int[N]; //in the second run UNcomment this line out
for (int i = 0; i < N; i++)
{
x[i] = 1;
y[i] = 2;
}

GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize - currentUsedRAM;

std::cout << "Current RAM used: " << currentUsedRAM << "\n";

return 0;
}

当我运行上面的代码时,我完全不明白,输出是:Current RAM used: 0 ,而自从我填充了两个 1D int 后,我期待大约 8mb 的东西。每个数组包含 100 万个条目。现在,如果我重新运行代码但生成 xy成为动态分配的数组,现在输出如预期的那样:Current RAM used: 8007680 .

这是为什么呢?如何让它在这两种情况下检测内存使用情况?

最佳答案

编译器已经优化了你的代码。事实上,对于您的第一次运行,既没有分配 x 也没有分配 y。考虑到有明显的副作用:GetProcessMemoryInfo 的返回值,这种优化似乎有点奇怪。

无论如何,您可以通过添加一些其他副作用来防止这种情况发生,例如输出这两个数组的每个元素的总和,这将保证崩溃。

为具有自动存储持续时间的本地对象分配内存发生at the beginning of the enclosing code block and deallocated at the end 。因此,您的代码无法测量 main 中任何自动存储持续时间变量的内存使用情况(也无法测量我删除的代码片段,我不知道)。但是对于那些具有动态存储持续时间的对象来说情况不同,它们是根据请求分配的。


我设计了一个涉及回避评论区讨论的测试。如果程序更深入,您可以看到内存使用量增加了。这证明它计算了堆栈上的内存使用情况。顺便说一句,它不是计算你的对象需要多少内存,而是计算你的程序需要多少内存。

void foo(int depth, int *a, int *b, uint64_t usage) {
if (depth >= 100)
return ;
int x[100], y[100];

for (int i = 0; i < 100; i++)
{
x[i] = 1 + (a==nullptr?0:a[i]);
y[i] = 2 + (b==nullptr?0:b[i]);
}

PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));

std::cout << "Current RAM used: " << info.WorkingSetSize - usage << "\n";

foo(depth+1,x,y,usage);

int sum = 0;
for (int i=0; i<100; i++)
sum += x[i] + y[i];

std::cout << sum << std::endl;
}

int main(void)
{
uint64_t currentUsedRAM(0);
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;

foo(0, nullptr, nullptr, currentUsedRAM);

return 0;
}

/*
Current RAM used: 0
Current RAM used: 61440
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 65536
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 69632
Current RAM used: 73728
*/

系统每次分配4k,一个page的大小。我不知道为什么它会变成 0,然后突然变成 61440。解释 Windows 如何管理内存非常困难,而且远远超出了我的能力,尽管我对 4k 的事情很有信心……而且它确实计算了内存使用量对于具有自动存储持续时间的变量。

关于c++ - 无法使用 GetProcessMemoryInfo 测量静态数组内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42852742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com