C++ 大内存分配

Qui*_*zen 1 c++ hardware malloc operating-system

我用C++编写了测试代码:

void handler()
{
    std::cout << "allocation failed" << std::endl;
    std::set_new_handler(nullptr);
}

int main()
{
    size_t allocations_count = 0u;
    std::set_new_handler(handler);

    try {
    
        while (true) {
        new char[1024u * 1024u * 1024u];
           ++allocations_count;
        }
    } catch (const std::bad_alloc& e) {
        std::cout << e.what() << '\n';
    }

    std::cout << "allocated " << allocations_count << " GB" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我的 8GB RAM 机器上,我得到了输出:

BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
allocation failed
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
std::bad_alloc
allocated 130676 GB
Run Code Online (Sandbox Code Playgroud)

我分配了 130676GB,我认为这太多了,因为我的存储大小是 500GB,而且我不认为虚拟内存可以处理这么多内存...任何人都可以解释为什么我可以在那里进行大量分配吗?

RAM = 8GB 存储 = 500GB MacBook Pro(13 英寸,M1,2020 年)

hyd*_*yde 8

64 位可以寻址 9313225 GB 内存。这比您分配的 130675 GB 高出一个数量级。

因此,即使操作系统保留了所有特殊地址范围,虚拟内存也可以轻松适应您分配的内存量。只要你不写入它,它就会包含零,并且不需要存储在任何地方(注意,C++语言不new保证内存包含零,但它显然允许它)。

将您分配的内存初始化为非零,然后看看会发生什么。在 Linux 上,这将触发 OOM(内存不足)杀手,当操作系统耗尽物理内存和磁盘交换来存储数据时,该杀手将开始终止进程​​。也许 OSX 也做了类似的事情。