是否可以在linux中分配大量虚拟内存?

问题描述 投票:2回答:1

出于某些目的,分配大量的虚拟空间会很有效,并且仅在被访问的页面中分配页面。分配大量内存是瞬时的,实际上并没有获取页面:

char* p = new char[1024*1024*1024*256];

确定,上面指出的是错误的,因为它是32位数字。访问第一个元素没有问题:

p[0] = 1;

但是,当稍后访问大约4Gb时,会出现段错误:

p[1000000000] = 1;

我希望new调用malloc并调用sbrk,并且当我访问起始位置之外的4Gb位置时,它将尝试将任务内存扩展那么多?

这里是完整程序:

#include <cstdint>
int main() {
  constexpr uint64_t GB = 1024*1024*1024;
  char* p = new char[256*GB]; // allocate large block of virtual space
  p[0] = 1;
  p[1000000000] = 1;
  p[2000000000] = 1;
}

现在,当我尝试分配大量内存时,我得到bad_alloc,因此显然malloc无法正常工作。

我的印象是mmap可以映射到文件,但是由于建议这样做,所以我正在研究它。

是否有任何方法可以分配大量的虚拟内存并稀疏访问页面,或者这不可行?

c++ linux memory-management virtual-memory
1个回答
2
投票

256*GB的值不适合32位整数类型的范围。尝试将uint64_t作为GB的一种类型:

constexpr uint64_t GB = 1024*1024*1024;

,或者,强制执行64位乘法:

char* p = new char[256UL * GB];

OT:我希望使用GB的定义:

constexpr uint64_t GB = 1UL << 30;
© www.soinside.com 2019 - 2024. All rights reserved.