我想通过检查操作系统的内存信息,找出进程在C ++程序中使用的字节数。我想这样做的原因是在分配内存时找到内存分配的可能开销(由于空闲列表中的内存控制块/节点等)。目前我在mac上并使用此代码:
#include <mach/mach.h>
#include <iostream>
int getResidentMemoryUsage() {
task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
&t_info_count) == KERN_SUCCESS) {
return t_info.resident_size;
}
return -1;
}
int getVirtualMemoryUsage() {
task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
&t_info_count) == KERN_SUCCESS) {
return t_info.virtual_size;
}
return -1;
}
int main(void) {
int virtualMemoryBefore = getVirtualMemoryUsage();
int residentMemoryBefore = getResidentMemoryUsage();
int* a = new int(5);
int virtualMemoryAfter = getVirtualMemoryUsage();
int residentMemoryAfter = getResidentMemoryUsage();
std::cout << virtualMemoryBefore << " " << virtualMemoryAfter << std::endl;
std::cout << residentMemoryBefore << " " << residentMemoryAfter << std::endl;
return 0;
}
运行此代码时,我希望在分配int后看到内存使用量增加。但是,当我运行上面的代码时,我得到以下输出:
75190272 75190272
819200 819200
我有几个问题,因为这个输出没有任何意义。
为什么在分配整数后,虚拟/驻留内存没有改变?
操作系统如何为正在运行的进程分配如此大量的内存。
当我运行代码并检查活动监视器时,我发现使用了304 kb的内存,但该数字与以编程方式获得的虚拟/驻留内存使用情况不同。
感谢您阅读
答案 0 :(得分:1)
C ++运行时通常在程序启动时分配一块内存,然后在使用new
之类的内容时将其分配给代码,并在调用{{1}时将其添加回块中}}。因此,操作系统对单个delete
或new
调用一无所知。对于C(或C ++)中的delete
和malloc
答案 1 :(得分:0)
首先,您要测量页数,而不是分配的内存。其次,运行时pre在启动时分配几页。如果你想观察一些东西分配多个int。尝试分配几千个,你会发现一些变化。