std :: string没有将数据存储在连续的内存位置的好处(在C++ 11之前)

bol*_*lov 10 c++ memory string

In C++98并且C++03 std::string可能已将其底层数据存储在非连续内存中.这是什么原因?这个宽松的要求可以实现哪些可能的优化?有没有任何编译器/架构实际使用它?

如果你将字符串的一部分存储在不同的内存位置,那么迭代器不会过于复杂吗?这个类也是如此,因为它需要准确知道字符串的不同部分在哪里.

Bat*_*eba 10

主要原因是字符串连接可以在没有重新分配的情况下进行.我相信早期版本的STLPort利用了它.

另一个原因是可以实现写时复制或甚至部分写时复制.虽然其他要求std::string(特别是C++ 11的移动语义)现在意味着这已不再可能.

  • @bolov:对于也不使用连续内存的`std :: deque`,迭代器并不过分复杂 (3认同)