分配内存时内存使用量不会增加

时间:2018-03-12 18:01:28

标签: c++ macos memory ram

我想通过检查操作系统的内存信息,找出进程在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

我有几个问题,因为这个输出没有任何意义。

  1. 为什么在分配整数后,虚拟/驻留内存没有改变?

  2. 操作系统如何为正在运行的进程分配如此大量的内存。

  3. 当我运行代码并检查活动监视器时,我发现使用了304 kb的内存,但该数字与以编程方式获得的虚拟/驻留内存使用情况不同。

    1. 我的最终目标是能够在分配数据时找到内存开销,所以有没有办法做到这一点(即确定操作系统使用的字节数,并与分配的字节进行比较,找出差异就是我的意思目前正在考虑)
    2. 感谢您阅读

2 个答案:

答案 0 :(得分:1)

C ++运行时通常在程序启动时分配一块内存,然后在使用new之类的内容时将其分配给代码,并在调用{{1}时将其添加回块中}}。因此,操作系统对单个deletenew调用一无所知。对于C(或C ++)中的deletemalloc

也是如此

答案 1 :(得分:0)

首先,您要测量页数,而不是分配的内存。其次,运行时pre在启动时分配几页。如果你想观察一些东西分配多个int。尝试分配几千个,你会发现一些变化。