可能std :: vector使用小缓冲区优化?
我今天在想我的同事是否可以实现std :: vector来利用小缓冲区优化。 通过查看C ++ 11草案,我在23.3.1p8阅读
对于非数组的标准容器types的容器a和b,expression式a.swap(b)应交换a和b的值,而不对每个容器元素调用任何移动,复制或交换操作。
起初似乎取消了小缓冲区优化,但是在as-if规则下,我们仍然可以为非类types进行小缓冲区优化(因为我们无法观察正在执行的副本)。 接下来的文字似乎更难以“愚弄”
每个在交换之前引用一个容器中的元素的迭代器应该在交换之后引用另一个容器中的相同元素。
这足以防止实施std :: vector的小缓冲区优化? 有没有其他的路障,或者最终是否有可能有SBO的std :: vector?
23.2.1 / p10 / b6:
除非另有规定 …
- 没有swap()函数使任何引用,指针或迭代器引用正在交换的容器的元素无效。 …
无处不在“另外指定” vector
。 所以这不包括SBO的vector
。
string
不受这个规则的约束,因为它在21.4.1 / p6中做了“另外指定”
引用basic_string序列的元素的引用,指针和迭代器可能会被basic_string对象的下列用法所取消:
- 作为任何引用非const basic_string作为参数的标准库函数的参数
例如,作为非成员函数swap()(21.4.8.8),运算符>>()(21.4.8.9)和getline()(21.4.8.9)的参数,或者作为basic_string的参数: :交换()
除了迭代器失效的问题之外,还有一个避免小缓冲区优化的安全性参数。
如果写入溢出一个std::vector
,你会得到堆腐败,这是很难预测被覆盖,很难利用任意代码执行。
如果缓冲区被embedded到本地variables中,则溢出会破坏堆栈,并且攻击者可能会获得对返回地址的控制,这更有用(例如,返回到libc攻击)。