【问题标题】:Visual Studio C++ : same program using different amounts of RAM under different executable namesVisual Studio C++:同一程序在不同的可执行文件名下使用不同数量的 RAM
【发布时间】:2021-07-10 16:46:27
【问题描述】:

这可能是一个普遍的问题,但这个问题确实让我感到困惑。

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

这两个对象都是使用具有相同参数的简单调用 new 创建的。构造函数后面的代码是一样的。

作为细节:第一个项目包含的 .cpp 文件比第二个项目少得多。所以我认为这可能是exe内部碎片的问题。另外,我还尝试在 main 函数中执行任何代码之前进行中断,并且内存使用量已经大不相同(第一个应用程序为 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: 问题目前已“解决”。请参阅下面的答案。

【问题讨论】:

  • 贴出代码,否则我们瞎拍。 (但要尽可能小!)

标签: c++ visual-studio ram


【解决方案1】:

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

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 搜索似乎也无法提供帮助...

【讨论】:

  • 很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。
猜你喜欢
  • 2014-03-19
  • 2013-02-03
  • 2019-11-23
  • 2017-03-10
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多