【问题标题】:new does not allocate memorynew 不分配内存
【发布时间】:2015-04-29 12:56:40
【问题描述】:

这应该每秒用大约 100 MB 填充我的内存。我使用 gnome-systemmonitor 和 htop 跟踪内存使用情况。但不知何故,它没有。为什么?

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

int main(int argc, char *argv[])
{
    while (true){
        std::cout << "New one" << std::endl;
        new char[100000000];
        sleep(1);
    }
    return 0;
}

运行:

g++ -std=c++11 -O0  main.cpp; ./a.out  

【问题讨论】:

  • 很可能是延迟分配。尝试向分配的数组写入一些内容。
  • 我原本以为它与this 相关,但似乎即使使用5.1 gcc 也不会像clang 和godbolt shows gcc does call new 那样对new 进行相同的优化......所以Paul 可能是正确的... 另一方面,clang 将优化对 new away 的调用 -O1 和更大。
  • 您知道 100MB 将是 char[104857600]?我猜新命令会被优化出来,因为它没有理由在那里......
  • @ShafikYaghmour 这就是我使用 -O0 的原因
  • 您没有分配任何内存。在任何现代按需分页虚拟内存操作系统(如 OSX、Linux、Windows)上,您只分配地址空间。 64 位操作系统有多达 256 TB 的可用空间。所以你可能只是等待的时间不够长,它需要 256E12 / 1E8 * sleep(1) = 256E4 毫秒 = 2560 秒。差不多一个小时的3/4。删除 sleep(1) 调用会更快:)

标签: c++ memory


【解决方案1】:

因为您没有使用它,Linux 会进行惰性分配,因此在您使用它之前它实际上不会映射任何内存页面。

如果你输入一些代码,例如:

char* test = new char[100000000];
test[0] = 'a';
test[4096] = 'b';
...

您应该看到它实际上正在消耗您的系统内存。

【讨论】:

    【解决方案2】:

    我只见过clang optimize away calls to new,通常编译器不会在您使用-O0 时执行如此激进的优化。

    我们可以从godbolt 看到gcc 确实没有优化掉非常相似代码中对new 的调用:

    .L2:
     movl   $100000000, %edi
     call   operator new[](unsigned long)
     movl   $1, %edi
     call   sleep
     jmp    .L2
    

    因此很可能涉及Paul is correct 和惰性分配,因此一旦您写入分配的内存,您就会看到它正在被使用。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2020-11-09
      • 2013-05-09
      • 2018-02-04
      相关资源
      最近更新 更多