C++ c+的延迟分配+;对象数组
如果我这样做:C++ c+的延迟分配+;对象数组,c++,linux,C++,Linux,如果我这样做: void f() { const int n = 1<<14; int *foo = new int [n]; } void f(){ const int n=1正如许多评论所说,operator new通常在引擎盖下使用malloc。malloc分配空间,但默认情况下不分配物理页。然而,malloc通常将内部数据写入内存块的开头,因此只分配第一个或前几页由于虚拟地址空间将出现故障,并由Linux内核进行物理分配。Linux内核会将所有分配的物理页归
void f() {
const int n = 1<<14;
int *foo = new int [n];
}
void f(){
const int n=1正如许多评论所说,operator new
通常在引擎盖下使用malloc
。malloc
分配空间,但默认情况下不分配物理页。然而,malloc
通常将内部数据写入内存块的开头,因此只分配第一个或前几页由于虚拟地址空间将出现故障,并由Linux内核进行物理分配。Linux内核会将所有分配的物理页归零,因此,无论您是否将()
添加到分配的末尾以归零,初始化分配的内存对于分配的新物理页可能没有影响。(在这种情况下,映射到已分配虚拟地址范围的已分配物理页将归零。)对于运行Linux 5.4.0-51-generic的标准Ubuntu 20.04机器
我们可以直接观察到这一点。在下面的代码中,我将n
值增加到1,这取决于new
的实现,但是new
很可能是用brk
实现的,witch不能是懒惰的,如果你想要懒惰的分配,你应该看看mmap
请看一下inenew
在引擎盖下使用malloc
。@Ron链接中没有提到的一件事是,malloc
使用数据进行内部记账,并将在调用brk
后写入分配的数据,使其成为一个非懒汉Linux内核在其通常/默认配置中启用Overmit时,将使用在实际写入虚拟地址之前,请不要使用物理页支持任何分配。@Tyker:对于大型分配,malloc
所接触的页将很少(如果使用mmap
,甚至为零)。
void f() {
const int n = 1<<14;
int *foo = new int [n]();
}
struct X {
int a, b, c, d, f, g, ..., z;
}
void f() {
int *foo = new X();//lazy?
const int n = 1<<14;
int *foo = new X [n]();//lazy?
}
#include <unistd.h>
int main() {
int *foo = new int [1 << 24];
sleep(100);
}
#include <unistd.h>
struct X {
int a[1 << 24];
};
int main() {
auto foo = new X;
sleep(100);
}
#include <unistd.h>
int g_a[1 << 24];
int f(int i) {
static int a[1 << 24];
return a[i];
}
int main(int argc, const char* argv[]) {
sleep(20);
int k = f(2930);
sleep(20);
return argc + k;
}