既然有了虚拟内存,为什么还需要内存保护呢?

Mar*_*ace 1 c++ memory-management allocation virtual-memory access-violation

通过内存保护,我的意思是以下程序将在许多机器上抛出运行时异常:

#include <iostream>

int main() {
    int* my_int = new int[12];
    std::cout << my_int[20000];
    delete[] my_int;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序给出以下错误:

Exception thrown at 0x00007FF7A467101A in myprogram.exe: 0xC0000005: Access violation reading location 0x000002794CA635C0.
Run Code Online (Sandbox Code Playgroud)

由于每个进程都有自己的虚拟内存,因此其他程序已经受到保护,免受我的代码中的访问冲突的影响。在我看来,正确的程序会付出运行时成本,因为不正确的程序可能会访问未分配的内存。

为什么计算机在调试模式之外还要费力地防止访问违规?

编辑:这个问题的一个很好的初步答案是“这些检查通常是在硬件中完成的”。接下来的问题是“如果不需要在访问冲突上引发异常,是否可以制造出更快的硬件? ”由于 CPU 硬件优化的大部分内容都与空间有关,我认为答案是“肯定是的,但不是”足够值得了。” 我们在硬件上为访问违规检查支付了多少成本?

Cal*_*eth 5

C++ 可能会说越界访问具有未定义的行为,但它运行的平台将是确定性的。

当您访问未映射的虚拟地址时,系统必须执行某些操作。在非玩具系统上,引发内存保护信号是在硬件中完成的,因此您不能真正说存在性能损失。