C++ new不分配内存

C++ new不分配内存,c++,memory,C++,Memory,这会让我的内存每秒都充满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[1000000

这会让我的内存每秒都充满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;
}

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

如果您放置一些代码,如:

char* test = new char[100000000];
test[0] = 'a';
test[4096] = 'b';
...
您应该看到它实际上在消耗您的系统内存。

我只看到过,一般来说,当您使用
-O0
时,编译器不会执行这种激进的优化

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

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

因此,最有可能的是延迟分配,因此一旦您写入分配的内存,您将看到它正在使用。

最有可能的是延迟分配。尝试向分配的数组中写入一些内容。我最初认为它与相关,但似乎即使使用
5.1
gcc也不会像clang那样对new进行同样的优化,而且。。。所以保罗可能是对的。。。另一方面,clang将优化对new away at
-O1
及更高版本的调用。您知道100MB将是char[104857600]?我猜新命令得到了优化,因为它没有理由在那里…@ShafikYaghmour这就是为什么我使用-o0你没有分配任何内存。在OSX、Linux、Windows等现代按需分页虚拟内存操作系统上,您只需分配地址空间。64位操作系统的可用容量高达256 TB。因此,您可能只是等待的时间不够长,需要256E12/1E8*睡眠(1)=256E4毫秒=2560秒。差不多3/4小时。删除sleep(1)调用会使它更快:)
.L2:
 movl   $100000000, %edi
 call   operator new[](unsigned long)
 movl   $1, %edi
 call   sleep
 jmp    .L2