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

C++11 and C++03 differs in support for small string optimization for std::string?

本文关键字:c++ 字符串 优化 方面 有所不同 string 支持 std      更新时间:2023-10-16

在c++ 11标准的兼容性附录中,从c++ 03到c++ 11的一个变化描述如下:

C.2.11 Clause 21: string库
21.4.1
更改:放宽basic_string无效规则
基本原理:允许小字符串优化。
对原始特性的影响:有效的c++ 2003代码可以执行在本国际标准中有所不同。某个const成员函数,如data和c_str,不再使迭代器失效。

从c++ 03到c++ 11, std::string的迭代器失效规则确实发生了变化,data()c_str()不再允许使迭代器失效,但我不知道这是如何导致"allow small-string optimization"的基本原理的?在c++ 11之前不是已经允许SSO了吗?


在我看到兼容性附录中的SSO注释之前,我所知道的c++ 11和c++ 03之间std::string的两个不同之处是:

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

我把c++ 11对c_str()data()的非无效保证作为对连续存储的更改的直接结果。现在看来,这与SSO实现有一些联系,我想知道幕后逻辑的细节。谢谢。

我相信你误解了"Change":这不是指datac_str的无效规则,而是指swap的无效规则。

这个问题给了我这个想法,当我阅读你的引用和链接的问题/答案时,我认为我是正确的。

由于basic_string的swap可以使迭代器无效,因此可以实现SSO。在c++ 03中,basic_string是一个可逆容器,这意味着它必须遵守swap ping容器的这个要求:

对于非数组的标准容器类型的容器a和b,表达式a.swap(b)应在不调用对单个容器元素的移动、复制或交换操作的情况下交换a和b的值。

我可能大错特错,IANALL(我不是语言律师)。