在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之间的两个不同之处是:
operator[]
,不允许使迭代器失效)我把C++11的c_str()
和data()
的非无效保证作为向连续存储转变的直接结果。现在似乎与SSO实现有某种联系,我想知道幕后逻辑的细节。谢谢。
发布于 2014-03-11 10:57:03
我认为您误解了“更改”:这不是指data
和c_str
的失效规则,而是指swap
的无效规则。
This question给了我这个想法,当我读到你的引语和相关的问题/答案时,我认为我是正确的。
由于basic_string
的交换可以使迭代器失效,所以可以实现SSO。在C++03中,basic_string
是一个可逆容器,这意味着它必须满足对swap
ping容器的这一要求:
对于数组以外的标准容器类型的容器a和b,表达式a.swap(b)应该在不调用单个容器元素的任何移动、复制或交换操作的情况下交换a和b的值。
不过,我可能大错特错了,我不是语言律师。
https://stackoverflow.com/questions/22322487
复制相似问题