相关疑难解决方法(0)

在std :: string的上下文中首字母缩略词SSO的含义

关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?

显然不是"单点登录"."共享字符串优化",或许?

c++ string optimization

141
推荐指数
3
解决办法
2万
查看次数

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

在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实现存在一些联系,我想知道幕后逻辑的细节.谢谢.

c++ string language-lawyer c++11

9
推荐指数
1
解决办法
944
查看次数

为什么 Microsoft 的 std::string 实现需要堆栈上的 40 个字节?

最近看了这个关于 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)

c++ string

5
推荐指数
1
解决办法
1419
查看次数

标签 统计

c++ ×3

string ×3

c++11 ×1

language-lawyer ×1

optimization ×1