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

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

在……里面一个关于优化和代码风格的C+问题,在优化副本的上下文中引用了“SSO”的几个答案。std::string..在这种情况下,SSO是什么意思?

显然不是“单点登录”。“共享字符串优化”,也许?


小唯快跑啊
浏览 607回答 3
3回答

缥缈止盈

背景/概况对自动变量(“来自堆栈”)的操作,这些变量是无需调用而创建的变量。malloc&nbsp;/&nbsp;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&nbsp;string&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;all&nbsp;83&nbsp;member&nbsp;functionsprivate: &nbsp;&nbsp;&nbsp;&nbsp;std::unique_ptr<char[]>&nbsp;m_data; &nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;m_size; &nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;m_capacity; &nbsp;&nbsp;&nbsp;&nbsp;std::array<char,&nbsp;16>&nbsp;m_sso;};对于64位系统,这通常意味着std::string每个字符串有24字节的“开销”,另外还有16字节用于SSO缓冲区(此处选择16字节,而不是由于填充要求而选择20字节)。在我的简化示例中,存储这三个数据成员加上一个本地字符数组是没有意义的。如果m_size <= 16,然后我会把所有的数据都放进m_sso,所以我已经知道了容量,并且不需要指向数据的指针。如果m_size > 16,那我就不需要m_sso..在我需要它们的地方绝对没有重叠之处。一个不会浪费任何空间的更聪明的解决方案看起来会更像这样(未经测试,仅用于示例目的):class&nbsp;string&nbsp;{public: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;all&nbsp;83&nbsp;member&nbsp;functionsprivate: &nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;m_size; &nbsp;&nbsp;&nbsp;&nbsp;union&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;is&nbsp;probably&nbsp;better&nbsp;designed&nbsp;as&nbsp;an&nbsp;array-like&nbsp;class &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::unique_ptr<char[]>&nbsp;m_data; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;m_capacity; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;m_large; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::array<char,&nbsp;sizeof(m_large)>&nbsp;m_small; &nbsp;&nbsp;&nbsp;&nbsp;};};我假设大多数实现都是这样的。

Helenr

SSO是“小字符串优化”的缩写,这种技术将小字符串嵌入到String类的主体中,而不是使用单独分配的缓冲区。
打开App,查看更多内容
随时随地看视频慕课网APP