【发布时间】:2012-01-01 17:17:33
【问题描述】:
我今天和我的同事想知道是否可以实现 std::vector 以利用小缓冲区优化。通过查看 C++11 草案,我阅读了 23.3.1p8
表达式 a.swap(b),对于标准容器类型而非数组的容器 a 和 b,应交换 a 和 b 的值,而不对单个容器元素调用任何移动、复制或交换操作。
起初这似乎禁止了小缓冲区优化,但在 as-if 规则下,我们仍然可以对非类类型进行小缓冲区优化(因为我们无法观察到正在完成的复制)。接下来的文字似乎更难“愚弄”
在交换之前引用一个容器中的元素的每个迭代器都应该在交换之后引用另一个容器中的相同元素。
这是否足以阻止为 std::vector 实现小缓冲区优化?是否有任何其他障碍,或者最终有可能在 SBO 中使用 std::vector?
【问题讨论】:
-
string是否有相同的swap子句? -
llvm libc++ 项目页面提到使用 SBO,这表明 (1) litb 引用的规则不适用于字符串,或者 (2) 有某种方法可以将 SBO 与不考虑这些规则的字符串,或者 (3) libc++ 作者在阅读标准的这一部分时会感到失望。
-
llvm libc++ 项目页面指的是字符串,而不是向量。我相信 Johannes 指出的交换/迭代器评论确实禁止向量的 SBO。
-
21.4.1/p6 特别允许 string::swap 使迭代器无效。