为了账号安全,请及时绑定邮箱和手机立即绑定

STD:String上下文中首字母缩略词SSO的含义

STD:String上下文中首字母缩略词SSO的含义

C++ C
小唯快跑啊 2019-06-20 15:27:23
STD:String上下文中首字母缩略词SSO的含义在……里面一个关于优化和代码风格的C+问题,在优化副本的上下文中引用了“SSO”的几个答案。std::string..在这种情况下,SSO是什么意思?显然不是“单点登录”。“共享字符串优化”,也许?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

背景/概况

对自动变量(“来自堆栈”)的操作,这些变量是无需调用而创建的变量。malloc / new)通常比涉及空闲存储(“堆”)的速度快得多,后者是使用new)。然而,自动数组的大小在编译时是固定的,但是来自空闲存储的数组的大小则不是。此外,堆栈大小是有限的(通常是少数MIB),而空闲存储仅受系统内存的限制。

SSO是短/小字符串优化。一个std::string通常将字符串存储为指向空闲存储的指针(“堆”),它提供类似的性能特征,就像要调用new char [size]..这可以防止非常大的字符串发生堆栈溢出,但速度可能会更慢,特别是对复制操作而言。作为一种优化,许多实现的std::string创建一个小的自动数组,类似于char [20]..如果您的字符串为20个或更小的字符(给定此示例,实际大小不同),则它将直接存储在该数组中。这就避免了调用new这会让事情变得更快一些。

编辑:

我没想到这个答案会如此流行,但既然如此,让我给出一个更现实的实现,但请注意,我从来没有真正读过任何SSO的实现“在野外”。

实施细节

至少,std::string需要存储以下信息:

  • 大小
  • 容量
  • 数据的位置

大小可以存储为std::string::size_type或者是指向终点的指针。唯一的区别是用户调用时是否需要减去两个指针。size或者添加一个size_type当用户调用时指向指针。end..容量也可以任意存储。

你不用付钱。

首先,考虑基于以上概述的天真实现:

class string {public:
    // all 83 member functionsprivate:
    std::unique_ptr<char[]> m_data;
    size_type m_size;
    size_type m_capacity;
    std::array<char, 16> m_sso;};

对于64位系统,这通常意味着std::string每个字符串有24字节的“开销”,另外还有16字节用于SSO缓冲区(此处选择16字节,而不是由于填充要求而选择20字节)。在我的简化示例中,存储这三个数据成员加上一个本地字符数组是没有意义的。如果m_size <= 16,然后我会把所有的数据都放进m_sso,所以我已经知道了容量,并且不需要指向数据的指针。如果m_size > 16,那我就不需要m_sso..在我需要它们的地方绝对没有重叠之处。一个不会浪费任何空间的更聪明的解决方案看起来会更像这样(未经测试,仅用于示例目的):

class string {public:
    // all 83 member functionsprivate:
    size_type m_size;
    union {
        class {
            // This is probably better designed as an array-like class
            std::unique_ptr<char[]> m_data;
            size_type m_capacity;
        } m_large;
        std::array<char, sizeof(m_large)> m_small;
    };};

我假设大多数实现都是这样的。


查看完整回答
反对 回复 2019-06-20
?
Helenr

TA贡献1780条经验 获得超4个赞

SSO是“小字符串优化”的缩写,这种技术将小字符串嵌入到String类的主体中,而不是使用单独分配的缓冲区。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 606 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信