是否可以在linux中分配大量虚拟内存?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在linux中分配大量虚拟内存?相关的知识,希望对你有一定的参考价值。
出于某些目的,分配大量的虚拟空间会很有效,并且仅在被访问的页面中分配页面。分配大量内存是瞬时的,实际上并没有获取页面:
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可以映射到文件,但是由于建议这样做,所以我正在研究它。
是否有任何方法可以分配大量的虚拟内存并稀疏访问页面,或者这不可行?
答案
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;
以上是关于是否可以在linux中分配大量虚拟内存?的主要内容,如果未能解决你的问题,请参考以下文章