C++大内存分配

标签 c++ operating-system malloc hardware

我用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;
}

在我有 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

我分配了 130676GB,我觉得太多了,因为我的存储大小是 500GB,我不认为虚拟内存可以为这个数量的内存提供服务...谁能解释为什么我可以在那里进行大量分配?

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

最佳答案

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

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

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

关于C++大内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72098115/

相关文章:

C++ 是删除运算符重写内存吗?

c - 程序的虚拟地址空间有多大?

c++ - 乘法比浮点除法快吗?

c++ - 获取 DLL 文件的外部命令

c++ - 是否有一个库类来表示 float ?

c - 如何在 Linux 中使用微状态记账?

基于操作系统版本的 C# 条件编译变量

C编程: how do you print the contents of a file after it's been dynamically allocated?

结构中的 C malloc

multithreading - 寻求帮助, "error: GC operation on unregistered thread. Thread registered implicitly."