Visual Studio C++:同一程序在不同的可执行名称下使用不同数量的 RAM

Visual Studio C++ : same program using different amounts of RAM under different executable names

这可能是一个普遍的问题,但这个问题真的让我很困惑。

我有两个不同的 C++ 应用程序,使用 Visual Studio 2012 编译,需要同一个对象的实例。我在创建每个对象之前放置了一个断点,以通过步进我的程序来测量 RAM 使用情况。第一个应用程序在创建对象后占用大约 2.5 MiB 的 RAM,而第二个应用程序占用 30 MiB!

这两个对象都是通过简单地调用具有相同参数的 new 创建的。构造函数背后的代码是相同的。

作为一个细节:第一个项目包含的 .cpp 文件比第二个项目少得多。所以我认为这可能是exe内部碎片的问题。另外,我还尝试在主函数内执行任何代码之前中断,并且内存使用情况已经有很大不同(第一个应用程序为 6 MiB,第二个应用程序为 35 MiB)。

有人知道会发生什么吗?


编辑: 所述对象是一个 DirectX 上下文,具有创建 Direct3D 实例和设备的构造函数。实例和设备的创建方式相同,但两个应用程序之间的 RAM 使用率不同。

这是创建 D3D 设备的代码:

d3d_presentParams = new D3DPRESENT_PARAMETERS; ZeroMemory( d3d_presentParams, sizeof(D3DPRESENT_PARAMETERS) );
d3d_presentParams->Windowed = !window->isFullscreen();
d3d_presentParams->SwapEffect = D3DSWAPEFFECT_DISCARD;
d3d_presentParams->hDeviceWindow = window->getHwnd();
d3d_presentParams->MultiSampleType = antiAlias;
d3d_presentParams->EnableAutoDepthStencil = true;
d3d_presentParams->AutoDepthStencilFormat = D3DFMT_D32F_LOCKABLE;
d3d_presentParams->PresentationInterval = (info.m_vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE);

{
    d3d_presentParams->BackBufferCount  = 1;
    d3d_presentParams->BackBufferFormat = D3DFMT_A8R8G8B8;
    d3d_presentParams->BackBufferWidth  = m_viewportSize.x;
    d3d_presentParams->BackBufferHeight = m_viewportSize.y;
}
    
d3d->CreateDevice(
    D3DADAPTER_DEFAULT,
    D3DDEVTYPE_HAL,
    window->getHwnd(),
    D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED,
    d3d_presentParams,
    &d3d_device);

编辑 2 : 问题目前已“解决”。请参阅下面的答案。

好吧,我有点“解决”了它。你不会相信问题出在哪里。

TL;DR : 重命名可执行文件可将 RAM 使用量从 80 MiB 降低到 28 MiB。似乎 Windows 对未经验证的应用程序持怀疑态度,因为我在 C:/Users/<Me>/AppVerifierLogs/.

中发现了一个充满日志的目录

RAM 的使用似乎与它包含的源文件数量有关。因此,我尝试完全复制我的一个项目。我不得不重命名它,因为一个解决方案不能有两个同名的项目...猜猜是什么,内存使用率在 main() 开始时降至 7.3 MiB,而不是之前的 30 MiB。

后来,我发现是特定的可执行文件名称导致它使用了更多的内存。我简单地重命名了 .exe 文件,问题就消失了。我什至尝试用我的应用程序名称重命名 Firefox 的 exe,但它导致崩溃。

最后,我在 C:/Users/<me>/AppVerifierLogs/ 中发现了至少 3000 个以我的申请命名的文件。这立即让我想到了 Windows 尝试验证应用程序的方式(例如,为了查看它们是否不是病毒)。

我不知道这是从哪里来的,也不知道如何关闭这个验证器,但是作为开发人员,Windows 对您正在开发的应用程序感到恐慌并注入(可能没用)里面的东西。

目前的修复只是重命名可执行文件。如果有人知道哪个应用程序可能有权访问此“AppVerifierLogs”目录,请提及它,因为此时即使 Google 搜索似乎也无济于事...