分配内存时内存使用量不会增加
Memory usage doesn't increase when allocating memory
我想通过检查操作系统的内存信息,从 C++ 程序中找出进程使用的字节数。我想这样做的原因是在分配内存时找到内存分配中可能的开销(由于空闲列表中的内存控制 blocks/nodes 等)。目前我在 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
我有几个问题,因为这个输出没有任何意义。
为什么在分配一个整数后 virtual/resident 内存没有改变?
为什么操作系统要为 运行ning 进程分配如此大量的内存。
当我执行 运行 代码并检查 activity 监视器时,我发现使用了 304 kb 的内存,但该数字与以编程方式获得的 virtual/resident 内存使用量不同。
- 我的最终目标是能够在分配数据时找到内存开销,所以有没有办法做到这一点(即确定 OS 使用的字节并与分配的字节进行比较以找到不同的是我目前的想法)
感谢阅读
C++ 运行时通常会在程序启动时分配一块内存,然后在您使用 new
之类的东西时将其打包到您的代码中,并在您调用 delete
。因此,操作系统对单个 new
或 delete
调用一无所知。对于 C(或 C++)
中的 malloc
和 free
也是如此
首先测量页数,而不是真正分配的内存。其次,运行时在启动时预分配几个页面。如果你想观察一些东西,分配的不仅仅是一个 int。尝试分配几千个,你会观察到一些变化。
我想通过检查操作系统的内存信息,从 C++ 程序中找出进程使用的字节数。我想这样做的原因是在分配内存时找到内存分配中可能的开销(由于空闲列表中的内存控制 blocks/nodes 等)。目前我在 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
我有几个问题,因为这个输出没有任何意义。
为什么在分配一个整数后 virtual/resident 内存没有改变?
为什么操作系统要为 运行ning 进程分配如此大量的内存。
当我执行 运行 代码并检查 activity 监视器时,我发现使用了 304 kb 的内存,但该数字与以编程方式获得的 virtual/resident 内存使用量不同。
- 我的最终目标是能够在分配数据时找到内存开销,所以有没有办法做到这一点(即确定 OS 使用的字节并与分配的字节进行比较以找到不同的是我目前的想法)
感谢阅读
C++ 运行时通常会在程序启动时分配一块内存,然后在您使用 new
之类的东西时将其打包到您的代码中,并在您调用 delete
。因此,操作系统对单个 new
或 delete
调用一无所知。对于 C(或 C++)
malloc
和 free
也是如此
首先测量页数,而不是真正分配的内存。其次,运行时在启动时预分配几个页面。如果你想观察一些东西,分配的不仅仅是一个 int。尝试分配几千个,你会观察到一些变化。