【问题标题】:Trying to reduce size of memory allocations in debug compilations for C++尝试减少 C++ 调试编译中的内存分配大小
【发布时间】:2015-09-02 09:30:11
【问题描述】:

我有一个在调试模式下编译的软件,以便于支持(获取转储文件等)。 Visual Studio 版本是 2008。

我们注意到我们的内存分配因此遭受了巨大的开销。在定义 DEBUG 时完成的每个内存分配(甚至是单个指针)都带有一个大标题,用于标识分配文件、行等。

我们正努力保持在 DEBUG 中,同时减少开销。似乎定义 _AFX_NO_DEBUG_CRT 应该可以解决问题 - 但在项目级别或在我们的 stdafx.h 文件中定义它会导致一长串编译错误:

c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtls_.h(66):错误 C2059:语法错误:'__asm' c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtls_.h(66):错误 C2143:语法错误:在 '{' 之前缺少 ')' ....

同样报错:#define _AFX_NO_DEBUG_CRT causes a stream of compilation errors,但是这里不需要创建自己的new,我也没有找到解决办法。

我在帖子中看到的另一种选择是使用 _CrtSetDbgFlag - 但这似乎只是为了避免将信息写入堆 - 但仍为其分配内存 - 这不是我们想要的。

有什么想法吗?

【问题讨论】:

  • 顺便说一句,我不明白你为什么不能使用发布版本。在项目设置中启用 PDB 生成(生成调试信息选项)。不要分发 PDB 文件。
  • 这样就不用担心内存分配的问题了,release build中的一切都优化好了
  • 感谢您的提示。至于另一篇文章 - 是的,这是同样的问题,但我没有尝试提供自己的 new 和 delete 的限制,只是想避免 CRT 块的开销 - 所以我希望也许有人可以提供帮助我(那里的答案都没有提供解决方案)。至于转向发布 - 这是我们试图避免的巨大变化(因为它会改变许多行为)并使其更难以调试。很高兴了解 PDB 生成选项。

标签: c++ visual-studio-2008 crt


【解决方案1】:
#define _CRTDBG_MAP_ALLOC

来自 MSDN,#define 语句将 CRT 堆函数的基本版本映射到相应的调试版本。通过包含 crtdbg.h,您可以将 malloc 和 free 函数映射到它们的调试版本 _malloc_dbg 和 _free_dbg,它们跟踪内存分配和释放。这是您要避免的。 此映射仅发生在调试版本中(其中定义了 _DEBUG)。发布版本使用普通的 malloc 和 free 函数。

为了达到您的目的, 只是#undef _CRTDBG_MAP_ALLOC

进入Visual Studio项目设置->调试设置,进入C/C++预处理器设置,在“Undefine Preprocessor Definitions”设置下添加_CRTDBG_MAP_ALLOC宏。

您应该能够生成一个 DEBUG 可执行文件,该可执行文件不会在运行时内存分配期间产生偷听。

【讨论】:

  • 我试过这个(我发现的定义是高级的) - 但我在调试时发现内存分配大小或函数没有变化。我仍然在里面: void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
  • @RamiJaschek 我想关键是尽早取消定义,并确保之后没有定义它 - 你最好的选择是查看预处理文件。
  • 有没有办法在项目级别定义它之前完成这项工作?我也尝试在我的 Stdafx.h 文件中添加它 - 无济于事。基本上,我正在使用一个非常简单的 Visual Studio 生成文件来测试它,我只添加了一个简单的 main 来分配一堆对象。我分配的对象只有几个字节,但我每次分配花费大约 70 个字节。这是一个非常简单、最小的项目。
  • @RamiJaschek 我不知道最早该怎么做,但是当我需要这样的东西时,我把它作为stdafx.h 中的第一行之一。该符号完全有可能稍后在您包含的其他一些标题中定义。查看预处理文件有助于定位问题。
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 2015-05-24
  • 2010-10-13
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多