首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++11和C++03在支持std::string的小字符串优化方面存在差异。

C++11和C++03在支持std::string的小字符串优化方面存在差异。
EN

Stack Overflow用户
提问于 2014-03-11 10:09:21
回答 1查看 1.3K关注 0票数 10

在C++11标准的兼容性附录中,从C++03到C++11的更改如下所示:

C.2.11第21条:字符串库 21.4.1 Change:放松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在C++11和C++03之间的两个不同之处是:

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

我把C++11的c_str()data()的非无效保证作为向连续存储转变的直接结果。现在似乎与SSO实现有某种联系,我想知道幕后逻辑的细节。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-11 10:57:03

我认为您误解了“更改”:这不是指datac_str的失效规则,而是指swap的无效规则。

This question给了我这个想法,当我读到你的引语和相关的问题/答案时,我认为我是正确的。

由于basic_string的交换可以使迭代器失效,所以可以实现SSO。在C++03中,basic_string是一个可逆容器,这意味着它必须满足对swapping容器的这一要求:

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

不过,我可能大错特错了,我不是语言律师。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22322487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档