在关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?
显然不是"单点登录"."共享字符串优化",或许?
在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之间的两个区别是:
operator[]不允许使迭代器无效)我采用了C++ 11的非无效保证,c_str()并将其data()作为连续存储更改的直接结果.现在似乎与SSO实现存在一些联系,我想知道幕后逻辑的细节.谢谢.
最近看了这个关于 facebook 实现字符串的视频,我很想看看微软实现的内部结构。不幸的是,字符串文件 (in %VisualStudioDirectory%/VC/include) 似乎不包含实际定义,而仅包含转换函数(例如 atoi)和一些运算符重载。
我决定从用户级程序中对它进行一些探索和刺激。当然,我做的第一件事是测试sizeof(std::string). 令我惊讶的是, std::string 需要 40 个字节!(无论如何在 64 位机器上。)前面提到的视频详细介绍了 facebook 的实现如何只需要 24 个字节而 gcc 的实现需要 32 个字节,所以这至少可以说是令人震惊的。
我们可以通过编写一个简单的程序来深入挖掘,该程序逐字节打印数据的内容(包括 c_str 地址),如下所示:
#include <iostream>
#include <string>
int main()
{
std::string test = "this is a very, very, very long string";
// Print contents of std::string test.
char* data = reinterpret_cast<char*>(&test);
for (size_t wordNum = 0; wordNum < sizeof(std::string); wordNum = wordNum + sizeof(uint64_t))
{
for (size_t i = 0; …Run Code Online (Sandbox Code Playgroud)