C++ new不分配内存
这会让我的内存每秒都充满100 MB。我使用gnome systemmonitor和htop跟踪内存。但不知何故,事实并非如此。为什么?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
#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