std::string s; for (size_t idx = 0; idx < 1000000; ++idx) { s.append(256, '$'); }
你都没注意到release模式capacity比你实际物理占用大么...?Working set是实际分配的物理内存的尺寸,内存申请之后不会直接分配物理空间,所以release模式string只会占用size那么大的地方而不是capacity那么大。debug模式要填充保护数据,所以会占capacity那么大。 你压根就不知道理论是什么还是别提理论上怎么样了。
不好意思地说,你这次又跑题了,呵呵 我问的是string的debug与release区别,而不是string与HeapAlloc的区别, 不论debug还是release,string的预先分配都是一样,s.capacity()也一样。 理论上说,debug/release用的内存应该几乎一样,因为只是差一个heap头尾可以忽略不计, 我统计内存占用用的是GetProcessMemoryInfo(),可能是这个函数哪里有误差导致的内存容量不一样。
考虑问题可不能狗熊掰棒子... string向后添加的速度之所以比你上次用HeapAlloc的速度快,就是string申请的内存总比实际需要的多。 你输出一下s的capacity就知道Debug模式的326M是哪儿来的了。而245M是实际写入过的内存的大小。
[quote=引用 2 楼 bluewanderer 的回复:] 如果你注意到你上个帖子我和另外一个人跑题的内容的话,你能发现一个件事就是:Release模式申请内存在真正使用之前是不一定会占用物理内存的。Debug模式因为要填充保护数据所以申请多少就要占用多少物理内存。
[quote=引用 4 楼 akirya 的回复:] debug版在函数调用前后插入栈检查的代码 debug一般不会内联
debug版在函数调用前后插入栈检查的代码 debug一般不会内联
如果你注意到你上个帖子我和另外一个人跑题的内容的话,你能发现一个件事就是:Release模式申请内存在真正使用之前是不一定会占用物理内存的。Debug模式因为要填充保护数据所以申请多少就要占用多少物理内存。
64,281
社区成员
250,470
社区内容
加载中
试试用AI创作助手写篇文章吧