new 不分配内存

new does not allocate memory

本文关键字:内存 分配 new      更新时间:2023-10-16

这应该每秒用大约 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  

因为你没有使用它,所以 Linux 会进行延迟分配,所以在你使用它之前,它实际上不会映射任何内存页。

如果你放一些代码,比如:

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

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

我只看到clang优化了对new的调用,一般来说,当您使用-O0时,编译器不会执行如此积极的优化。

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

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

所以很可能 Paul 是正确的,并且涉及惰性分配,因此一旦你写入分配的内存,你会看到它被使用。