今天我和同事想知道是否可以实现 std::vector 来利用小缓冲区优化。通过查看 C++11 草案,我在 23.3.1p8 读到
对于除数组之外的标准容器类型的容器 a 和 b,表达式 a.swap(b) 应交换 a 和 b 的值,而不对各个容器元素调用任何移动、复制或交换操作。
乍一看,这似乎禁止小缓冲区优化,但根据假设规则,我们仍然可以对非类类型进行小缓冲区优化(因为我们无法观察复制的完成)。下一段文字似乎更难“欺骗”
在交换之前引用一个容器中的元素的每个迭代器都应在交换之后引用另一个容器中的相同元素。
这是否足以阻止对 std::vector 实施小缓冲区优化?是否还有其他障碍,或者最终是否有可能拥有带有 SBO 的 std::vector ?
23.2.1 / p10 / b6:
除非另有规定 ...
- swap() 函数不会使引用被交换容器的元素的任何引用、指针或迭代器无效。
...
没有任何地方“另有说明”vector
。所以这宣布 SBO 为非法vector
.
string
不受此规则的约束,因为它在 21.4.1/p6 中“另有说明”:
引用 a 元素的引用、指针和迭代器
basic_string 序列可能会因以下使用而失效
basic_string 对象:
- 作为任何标准库函数的参数,以非常量 basic_string 的引用作为参数。^234
[234] 例如,作为非成员函数 swap() 的参数
(21.4.8.8)、operator>>() (21.4.8.9) 和 getline() (21.4.8.9),或作为
basic_string::swap() 的参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)