stl string的release版本相对于debug版本有什么优化?
先上代码:
std::string s;
for (size_t idx = 0; idx < 1000000; ++idx)
{
s.append(256, '$');
}
同样的代码,Debug和Release两种模式下运行差别不小:
Debug: 578 ms, 326 MB.
Release: 406 ms, 245 MB.
谁知道release版本相对于debug版本,
处理速度和内存方面,有什么优化?谢谢! stl string debug release 差别
[解决办法]
Debug版本分配的内存时通常会多分配一些(一般是一个整数),并在里面写入一个固定值,然后在内存释放时检查这个值是否改变,以便于更容易发现越界写错误。
Debug版本分配内存时会用某个数值去填充内存块,以便于更容易发现未初始化的错误。
Debug版本释放内存时会用某个数值去填充内存块,以便于更容易发现释放后访问的错误。
Debug版本在operator[]操作、迭代器访问时都会检查是否越界,release版本不做检查。此外at成员函数在release版本也会进行越界检查,并可能抛出out_of_range异常,因此它比operator[]慢。
Debug版本调用的是调试库,里面到处都是验证前置条件和后置条件的assert,而release版本没有这些验证。
总之,Debug版本的一切设置都把“更容易发现错误”作为第一目标,效率完全不在它的考虑范围之内。如果你发现某个Debug版的二分查找比顺序查找还慢,千万不要吃惊,这是很正常的,因为它的实现代码中很可能被加上了一段O(n)的代码来检查传进的序列是否有序,而这段代码不会出现在Release版本中。
[解决办法]
debug版在函数调用前后插入栈检查的代码
debug一般不会内联
[解决办法]
inline关键字基本上已经失效了,debug版本会忽略这一说明,所有函数都不inline。release版本会进行判断,太复杂的inline函数也不会inline,而简单的非inline的static全局函数、类模板函数、匿名空间中的函数、在函数定义的同一cpp文件中调用的函数(它们的共同特点就是在编译调用代码时能找到函数的定义代码)都会被编译为inline。
[解决办法]
考虑问题可不能狗熊掰棒子...
string向后添加的速度之所以比你上次用HeapAlloc的速度快,就是string申请的内存总比实际需要的多。
你输出一下s的capacity就知道Debug模式的326M是哪儿来的了。而245M是实际写入过的内存的大小。
[解决办法]
不只是你的string在占用内存,否则内存哪来的245 MB,运行库也要占用内存,Debug版的运行库比Release版的运行库占用内存大也很正常。
[解决办法]
不好意思地说,你这次又跑题了,呵呵
我问的是string的debug与release区别,而不是string与HeapAlloc的区别,
不论debug还是release,string的预先分配都是一样,s.capacity()也一样。
理论上说,debug/release用的内存应该几乎一样,因为只是差一个heap头尾可以忽略不计,
我统计内存占用用的是GetProcessMemoryInfo(),可能是这个函数哪里有误差导致的内存容量不一样。
你都没注意到release模式capacity比你实际物理占用大么...?Working set是实际分配的物理内存的尺寸,内存申请之后不会直接分配物理空间,所以release模式string只会占用size那么大的地方而不是capacity那么大。debug模式要填充保护数据,所以会占capacity那么大。
你压根就不知道理论是什么还是别提理论上怎么样了。