Visual Studio 2008 - 尝试减小C++调试编译中的内存分配大小

visual studio 2008 - Trying to reduce size of memory allocations in debug compilations for C++

本文关键字:编译 内存 分配 调试 C++ 2008 Visual Studio      更新时间:2023-10-16

我有一个在调试模式下编译的软件,以便于支持(获取转储文件等)。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 会导致一系列编译错误,但创建自己的新内容的要求在这里无关紧要,我在那里找不到解决方案。

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

有什么想法吗?

#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++ 预处理器设置,在"取消定义预处理器定义"设置下添加_CRTDBG_MAP_ALLOC宏。

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