可以std :: vector使用小缓冲区优化吗?

Joh*_*itb 48 c++ stdvector c++11

我今天和我的同事想知道是否可以实现std :: vector来利用小缓冲区优化.通过查看C++ 11草案,我在23.3.1p8阅读

表达式a.swap(b),对于除数组之外的标准容器类型的容器a和b,应交换a和b的值,而不对单个容器元素调用任何移动,复制或交换操作.

这开始似乎取决于小缓冲区优化,但在as-if规则下,我们将被允许仍然对非类类型进行小缓冲区优化(因为我们无法观察到正在完成的复制).下一个文字似乎更难"傻瓜"

在交换之前引用一个容器中的元素的每个迭代器应该在交换之后引用另一个容器中的相同元素.

这是否足以阻止为std :: vector实现小缓冲区优化?有没有其他的路障或最终有可能有SBO的std :: vector?

How*_*ant 47

23.2.1/p10/b6:

除非另有规定 ...

  • 没有swap()函数使任何引用,指针或迭代器无效,引用被交换的容器的元素....

没有任何地方"另有说明" vector.因此,这是对SBO的禁止vector.

string 不受此规则的约束,因为它在21.4.1/p6中"另有说明":

引用basic_string序列元素的引用,指针和迭代器可能会被该basic_string对象的以下用法无效:

  • 作为任何标准库函数的参数,将非const basic_string作为参数引用.^ 234

234)例如,作为非成员函数swap()(21.4.8.8),operator >>()(21.4.8.9)和getline()(21.4.8.9)的参数,或作为basic_string的参数: :交换()

  • 但是`move`不仅仅适用于临时工,它对于你不想复制的持久性结构也很有用.激励代码只是在局部变量中构建一个结构,然后将其移动到一个更永久的容器中.(当然,它并不总是被移动,或者我只是在那里开始构建它.) (2认同)