#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector< vector<int> > dp(50000, vector<int>(4, -1));
cout << dp.size();
}当简单地从命令行运行时,这个小程序需要一秒时间来执行。但是在调试器中运行时,需要超过8秒。暂停调试器显示它正在销毁所有这些向量。见鬼?
注: 2008 SP1,Core2Duo6700CPU,2GB内存。
补充道:为了澄清,不,我没有混淆调试和发布版本。这些结果都在同一个.exe上,甚至不需要在中间重新编译。事实上,在Debug和Release之间的切换不会改变什么。
发布于 2009-02-10 12:25:35
在调试器中运行会将内存分配库更改为执行更多检查的库。一个只做内存分配和去分配的程序将遭受比“正常”程序更多的痛苦。
编辑刚刚尝试在VS下运行您的程序,我得到了一个类似于
ntdll.dll!_RtlpValidateHeapEntry@12() + 0x117 bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0x97 bytes
ntdll.dll!_RtlFreeHeapSlowly@12() + 0x228bf bytes
ntdll.dll!_RtlFreeHeap@12() + 0x17646 bytes
msvcr90d.dll!_free_base(void * pBlock=0x0061f6e8) Line 109 + 0x13 bytes
msvcr90d.dll!_free_dbg_nolock(void * pUserData=0x0061f708, int nBlockUse=1)
msvcr90d.dll!_free_dbg(void * pUserData=0x0061f708, int nBlockUse=1)
msvcr90d.dll!operator delete(void * pUserData=0x0061f708)
desc.exe!std::allocator<int>::deallocate(int * _Ptr=0x0061f708, unsigned int __formal=4)
desc.exe!std::vector<int,std::allocator<int> >::_Tidy() Line 1134 C++它显示了ntdll.dll中的调试函数和正在使用的C运行时。
发布于 2009-02-11 03:05:12
在调试器中启动程序时,调试堆将自动启用,而不是使用调试器附加到已经运行的程序。
由Mario和Daniel撰写的“http://www.advancedwindowsdebugging.com/”一书提供了一些关于Windows堆的不错信息,事实证明,关于堆的章节是在网站上作为一个示例章节。
第281页有一个关于“附加与启动调试器下的进程”的侧边栏:
在调试器下启动进程时,堆管理器将修改所有创建新堆的请求,并更改堆创建标志以启用调试友好型堆(除非_NO_DEBUG_HEAP环境变量设置为1)。相比之下,附加到已经运行的进程上,进程中的堆已经使用默认堆创建标志创建了,并且不会设置调试友好标志(除非应用程序显式设置)。
(还有:半相关的问题,我之前在这里发布了部分答案。)
发布于 2009-02-10 12:23:02
运行带有调试器的程序总是比不运行的要慢。
这必须由VS连接到新的/delete调用并在附加时执行更多检查引起--或者运行时库使用IsDebuggerPresent API并在这种情况下执行不同的操作。
您可以在Visual中轻松地尝试这一点,使用Debug->Start调试或Debug->Start无需调试启动程序。没有调试就像命令行一样,具有完全相同的构建配置和可执行文件。
https://stackoverflow.com/questions/532092
复制相似问题