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

10
在 C++98 和 C++03 中,std::string 可能会将其底层数据存储在非连续的内存中。这样做的原因是什么?通过这种放松的要求可能会实现什么优化?是否有任何编译器或体系结构实际利用了这一点?
如果字符串的部分存储在不同的内存位置,那么迭代器会变得过于复杂。而且该类也会变得很复杂,因为它需要知道字符串的不同部分的确切位置。

迭代器并不需要过于复杂。可以采用 pair<string *, size_t> 的实现方式,其中 operator * 用来索引字符串,operator ++ 用来递增索引等等。当然,该类必须知道不同部分的位置,但如果存储在平衡树中,这将变得非常高效。参见 Rope - user4815162342
这是绳实现的另一个优缺点(据我所知,标准认为这应该是可能的):http://www.sgi.com/tech/stl/Rope.html - peterchen
1个回答

10

主要原因是字符串连接可以在不重新分配内存的情况下进行。我相信早期版本的STLPort利用了这一点。

另一个原因是可以实现写时复制甚至部分写时复制。尽管对std::string提出了其他要求(特别是C++11的移动语义),这已不再可能。


迭代器会不会太复杂了?而且,由于您需要精确知道字符串的哪些部分,因此该类会变得复杂。 - bolov
不加思索地说,我本以为迭代只是简单遍历连续部分并结合链表类型习语的一种稍微复杂的形式。 - Bathsheba
@bolov:迭代器:容易处理。 迭代器将包含对段的引用以及段中的偏移量。 如果段保存在双向链表或任何双向可迭代数据结构中,则只需增加一个if语句。 - peterchen
@peterchen,好的,在迭代器中你还有一个if。但是为了支持它,你需要一个链表...无论如何,我理解你的观点。 - bolov
3
针对 std::deque 使用非连续内存,迭代器并不过于复杂。 - Andriy Tylychko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接