C++小字符串优化 (SSO) 如何与容器配合使用?
How could C++ Small String Optimized (SSO) work with containers?
SSO解释说小字符串是在堆上分配的:好的,但是当在容器内构造时,这些内容不应该在堆栈上,因为容器可以在函数中创建并返回,而函数堆栈会过时。
所以我想 SSO 不适用于 STL 容器,是吗?
"小字符串"和"大字符串"之间的区别不在于将其存储在堆栈或堆上之间的区别。相反,不同的是间接程度。
这意味着std::string
对象可以保存指向实际字符串数据的指针,该指针可以是(几乎)任何长度,但具有间接动态内存的所有缺点 - 分配,解除分配,缓存未命中等。
或者,SSO 允许std::string
将小字符串"就地"存储在std::string
对象内部,无论它被分配到何处。如果对象位于某个容器(在堆上)中,则字符串将位于该容器中,但它不需要像大字符串那样的另一个间接寻址。
让我们用vector
和string
做一个例子。
-
请参阅我对"c ++ Vector,每当它在堆栈上扩展/重新分配时会发生什么?"的回答,看看
vector
通常"看起来像什么"。 -
如果将
string
存储在vector
中,则所有string
实例都将位于堆上。 -
字符串实例本身可以
- 在对象实例 (SSO) 中包含字符串数据本身,或者
- 在堆上分配内存以存储内容。
-
vector
类不关心string
类将其数据存储在哪里。 它只保存自行管理数据的对象。
SSO 不会影响在容器中存储string
。
PS:当然可以从函数返回堆栈对象。函数堆栈将"超出范围",但返回值将保留。否则你甚至不能回来int
。
SSO并不意味着无论如何string
内容都在堆栈上。这只是意味着(小字符串)数据存储在string
实例中。因此,如果实例在堆栈上,则数据在堆栈上。如果对象在堆上,则数据也在堆上。
你当然可以编写一个具有"小对象优化"的类似矢量的类,如果对象很小而且很少,它会将它们存储在内部(在容器对象本身内),否则将它们存储在堆上(就像std::vector
现在所做的那样)。
但是,由于对容器的要求,目前无法实现标准库中的容器。特别是,[container.requirements.general]/9说:
在交换之前引用一个容器中的元素的每个迭代器都应在交换后引用另一个容器中的相同元素。
这很难用小对象优化来实现,而且该要求不适用于basic_string
。
- 小字符串优化(调试与发布模式)
- FBString 的小字符串优化是否依赖于未定义的行为?
- C++ C 样式字符串/字符数组的大小 - 优化
- strlen 是否针对字符串文字进行了优化?
- 字符串编码用于内存优化
- 添加字符时,编译器会停止优化未使用的字符串
- 短(ASCII,每个字符 7 位)字符串存储和C++中的比较优化
- 为什么C++编译器不在按值传递方案中优化更多的字符串构造?
- 通过从字符串IIN C 中删除垃圾字符来优化大小
- 优化弹性字符串文字解析
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- C++小字符串优化 (SSO) 如何与容器配合使用?
- GCC无小的字符串优化
- 整数到字符串优化函数
- 优化c++代码以添加两个作为字符串的数字
- 想要优化此字符串操纵程序C
- C 优化用于字符串比较和替换
- C++.优化使用大量常量字符串的程序
- C++字符串内存重用优化
- 优化字符串创建