在 C++98 和 C++03 中,std::string 可能会将其底层数据存储在非连续的内存中。这样做的原因是什么?通过这种放松的要求可能会实现什么优化?是否有任何编译器或体系结构实际利用了这一点?
如果字符串的部分存储在不同的内存位置,那么迭代器会变得过于复杂。而且该类也会变得很复杂,因为它需要知道字符串的不同部分的确切位置。
如果字符串的部分存储在不同的内存位置,那么迭代器会变得过于复杂。而且该类也会变得很复杂,因为它需要知道字符串的不同部分的确切位置。
主要原因是字符串连接可以在不重新分配内存的情况下进行。我相信早期版本的STLPort利用了这一点。
另一个原因是可以实现写时复制甚至部分写时复制。尽管对std::string
提出了其他要求(特别是C++11的移动语义),这已不再可能。
if
。但是为了支持它,你需要一个链表...无论如何,我理解你的观点。 - bolovstd::deque
使用非连续内存,迭代器并不过于复杂。 - Andriy Tylychko
pair<string *, size_t>
的实现方式,其中operator *
用来索引字符串,operator ++
用来递增索引等等。当然,该类必须知道不同部分的位置,但如果存储在平衡树中,这将变得非常高效。参见 Rope。 - user4815162342