为什么shrink_to_fit不绑定?

时间:2010-04-18 21:31:29

标签: c++ optimization vector c++11

C ++ 0x FCD在23.3.6.2向量容量中表示:

void shrink_to_fit();
     

备注:shrink_to_fit是一个将capacity()减小为size()的非绑定请求。 [注意:请求是非绑定的,以允许特定于实现的优化的纬度。 - 后注]

允许进行哪些优化?

3 个答案:

答案 0 :(得分:13)

这非常紧张,但是:

考虑向量的分配器,它只能分配4 KB粒度的内存。然后,如果向量的容量为4096且大小为4095,则重新分配内存是没有意义的,因为这不会节省内存,但会浪费一些CPU时间来复制元素。

答案 1 :(得分:5)

四舍五入的想法确实是相关的,而是间接的。问题是“打算允许哪些优化。”这是对标准化过程的一些假设。优化。一般来说,目的是允许所有不可观察的优化,然后允许一些 - 例如复制省略,其中可以观察到复制ctor的非调用。在这种情况下,capacity() != size()可能是优化的可观察效果,​​标准允许它。

至于添加此纬度的原因,我还可以设想在capacity()仅为size()的101%时忽略收缩请求 - 收益太少。永远不会有一个确切的原因,因为LWG由许多有很多观点的人组成。只有(足够)达成共识,才能通过授予这种自由来创造足够的额外优化机会。

答案 2 :(得分:1)

虽然它已经很特别,但是矢量< bool>必须分配大小为8的块。我也知道有些人正在努力让malloc返回任何已分配块的“真实大小”,因此如果分配的块会引入不可避免的浪费,则向量会有用地使用该空间。

随着我们转向64位操作系统,内存空间突然变得(着名的最后一句话)比任何人都接近填充更大,因此分配大块虚拟内存并随时填充它们变得更加合理。移动物体是昂贵的,实际上是浪费时间,因为我们不会移动东西,因为物理记忆是有限的,只是从一个虚拟的地方到另一个虚拟的地方!