C++ 11和C++ 03在支持std :: string的小字符串优化方面有所不同吗?

goo*_*era 9 c++ string language-lawyer c++11

在C++ 11标准的兼容性附录中,从C++ 03到C++ 11的更改之一描述如下:

C.2.11第21节:字符串库
21.4.1
更改:松开basic_string失效规则
原理:允许小字符串优化.
对原始功能的影响:有效的C++ 2003代码可能在本国际标准中执行不同.某些const成员函数(如data和c_str)不再使迭代器无效.

迭代器失效规则std::string确实已从C++ 03更改为C++ 11,data()并且c_str()不允许再使迭代器失效,但我不知道这是如何导致" allow small-string optimization" 的基本原理的?在C++ 11之前是否已经允许SSO?


std::string在我遇到兼容性附录中的SSO注释之前,我所知道的C++ 11和C++ 03之间的两个区别是:

  • 保证元素在C++ 11中连续存储
  • COW实现不是C++ 11中的一个选项(某些操作,例如operator[]不允许使迭代器无效)

我采用了C++ 11的非无效保证,c_str()并将其data()作为连续存储更改的直接结果.现在似乎与SSO实现存在一些联系,我想知道幕后逻辑的细节.谢谢.

rub*_*nvb 7

我相信你误解了"变化":这是不是指的失效规则datac_str而是那些swap.

这个问题给了我这个想法,当我阅读你的引言和相关的问题/答案时,我认为我是对的.

由于basic_string交换可以使迭代器无效,因此可以实现SSO.在C++ 03中,basic_string是一个可逆容器,这意味着它必须符合swapping容器的这个要求:

表达式a.swap(b),对于除数组之外的标准容器类型的容器a和b,应交换a和b的值,而不对单个容器元素调用任何移动,复制或交换操作.

我可能会非常错,IANALL(我不是语言律师).