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
请看一下ine
new
在引擎盖下使用
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;
}