C ++ 0x FCD在23.3.6.2向量容量中表示:
void shrink_to_fit();
备注:shrink_to_fit是一个将capacity()减小为size()的非绑定请求。 [注意:请求是非绑定的,以允许特定于实现的优化的纬度。 - 后注]
允许进行哪些优化?
答案 0 :(得分:13)
这非常紧张,但是:
考虑向量的分配器,它只能分配4 KB粒度的内存。然后,如果向量的容量为4096且大小为4095,则重新分配内存是没有意义的,因为这不会节省内存,但会浪费一些CPU时间来复制元素。
答案 1 :(得分:5)
四舍五入的想法确实是相关的,而是间接的。问题是“打算允许哪些优化。”这是对标准化过程的一些假设。优化。一般来说,目的是允许所有不可观察的优化,然后允许一些 - 例如复制省略,其中可以观察到复制ctor的非调用。在这种情况下,capacity() != size()
可能是优化的可观察效果,标准允许它。
至于添加此纬度的原因,我还可以设想在capacity()
仅为size()
的101%时忽略收缩请求 - 收益太少。永远不会有一个确切的原因,因为LWG由许多有很多观点的人组成。只有(足够)达成共识,才能通过授予这种自由来创造足够的额外优化机会。
答案 2 :(得分:1)
虽然它已经很特别,但是矢量< bool>必须分配大小为8的块。我也知道有些人正在努力让malloc返回任何已分配块的“真实大小”,因此如果分配的块会引入不可避免的浪费,则向量会有用地使用该空间。
随着我们转向64位操作系统,内存空间突然变得(着名的最后一句话)比任何人都接近填充更大,因此分配大块虚拟内存并随时填充它们变得更加合理。移动物体是昂贵的,实际上是浪费时间,因为我们不会移动东西,因为物理记忆是有限的,只是从一个虚拟的地方到另一个虚拟的地方!