相关疑难解决方法(0)

MSVC 中的 Operator new 在调试模式下的行为与在发布模式下的行为不同

new在测试有关页面错误的一些内容时,我发现MSVC 中调试模式和发布模式下的操作方式存在一个奇怪的差异。考虑以下代码1

#include <array>

constexpr size_t PAGE_SIZE = 4096;

int main()
{
    const size_t count = 1000000;
    char* const mem = new char[PAGE_SIZE * count];

    // page align the pointer, c-style casts used for brevity
    auto* pages = (std::array<char, PAGE_SIZE>*)((size_t)mem - (size_t)mem % PAGE_SIZE + PAGE_SIZE);
    
    for (int i = 0; i < count; ++i)
        pages[i][0] = 'a';
}
Run Code Online (Sandbox Code Playgroud)

该代码在大多数体系结构上分配一百万个普通内存。然后它会物理地写入这个分配的内存,因此内存实际上必须“给予” 2给程序 - 而不仅仅是以某种方式为其“保留”。奇怪的是,当这真的发生时。为了调查这个问题,我使用 Visual Studio 调试器单步调试了代​​码,并查看了任务管理器中的内存使用情况图。结果如下:

测量结果

红色时间点是正在启动的程序,绿色时间点/间隔是对 的调用new char[],蓝色时间点/间隔是循环for

事实证明,在调试模式下, …

c++ memory memory-management visual-c++ page-fault

2
推荐指数
1
解决办法
156
查看次数

Windows程序存储器与Linux程序存储器

Linux为每个要使用的程序创建虚拟内存页面,操作系统处理将虚拟地址映射到真正的硬件地址,对吗?

但Windows如何做到这一点?Windows程序实际上是否具有转换为真实硬件地址的内存?我也知道当RAM过度使用时,windows可以使用硬盘内存,而这个过程又被称为虚拟内存,但我相信这是一个完全不同的概念?

linux windows virtual-memory linux-kernel

1
推荐指数
1
解决办法
840
查看次数