初学者问题内存分配c ++

Beginner quesiton memory allocation c++

我目前正在学习 C++。在一些堆分配练习中,我试图生成错误的分配。我的物理内存大约是38GB。为什么可以分配这么大的内存?我的基本字节计算有误吗?我不明白。谁能给我一个提示吗?谢谢

#include <iostream>


int main(int argc, char **argv){
    const size_t MAXLOOPS {1'000'000'000};
    const size_t NUMINTS {2'000'000'000};
    int* p_memory {nullptr};

    std::cout << "Starting program heap_overflow.cpp" << std::endl;
    std::cout << "Max Loops: " << MAXLOOPS << std::endl;
    std::cout << "Number of Int per allocation: " << NUMINTS << std::endl;

    for(size_t loop=0; loop<MAXLOOPS; ++loop){
        std::cout << "Trying to allocate new heap in loop " << loop 
                << ". current allocated mem = " << (NUMINTS * loop * sizeof(int)) 
                << " Bytes." << std::endl;

        p_memory = new (std::nothrow) int[NUMINTS];
        if (nullptr != p_memory)
            std::cout << "Mem Allocation ok." << std::endl;
        else {
            std::cout << "Mem Allocation FAILED!." << std::endl;
            break;
        }
    }
    return 0;
}

输出:

...
Trying to allocate new heap in loop 17590. current allocated mem = 140720000000000 Bytes.
Mem Allocation ok.
Trying to allocate new heap in loop 17591. current allocated mem = 140728000000000 Bytes.
Mem Allocation FAILED!.

许多(但不是全部)支持虚拟内存的操作系统使用称为需求分页的概念 - 当您 分配 内存时,您执行簿记,允许您使用该记忆。但是,您当时并没有保留物理内存的实际页面。1

当您实际尝试读取或写入该分配内存页面中的任何字节时,会发生页面错误。错误处理程序检测到页面已被预分配但未按需调入。然后它会保留物理内存页面,并在将控制权返回给程序之前设置 PTE。

如果您尝试在每次分配后立即写入您分配的内存,您可能会发现 运行 物理内存用完的速度要快得多。

备注:

1 可以有一个 OS 支持虚拟内存但立即分配物理内存以支持虚拟分配的实现;虚拟内存是复制实验的必要条件,但不是充分条件。

一条评论提到交换到磁盘。这可能是一个转移注意力的问题——页面文件的大小通常与内存大小相当,总分配量约为 140 TB,这比单个磁盘大得多。对页面到磁盘的空的、未触及的页面也是无效的。