禁用std:string的SSO

3

我想知道是否有一种编程方法可以禁用字符串SSO,使其不使用本地缓冲区存储短字符串?

1个回答

14

由于SSO是一种可选的优化方式,因此没有一种标准方法可以将其关闭。

实际上,你可以只需保留一个无法适应SSO缓冲区的字符串,就可以强制动态分配缓冲区:

std::string str;
str.reserve(sizeof(str) + 1);

至少在gcc上似乎可以工作,而且应该可以在可移植的情况下工作,因为内部缓冲区需要适合字符串。(在线演示


使用这种方法是否存在任何已知的不足之处? - Sayantan Ghosh
1
@SayantanGhosh 显而易见的是,禁用优化会使您失去其性能优势。这里更有趣的问题是:这样做的好处是什么?如果您的代码在没有SSO的情况下无法工作,但在有SSO的情况下可以正常运行,那么最好修复您的代码,而不是调整症状。 - Baum mit Augen
我在使用set emplace时遇到了同样的问题:https://dev59.com/YLTna4cB1Zd3GeqPB-ns。因为分配会产生一些额外的释放管理,所以我正在评估手动分配char数组与上述方法的区别。 - Sayantan Ghosh
@BaummitAugen 一个例子是将字符串视图(或裸指针)存储到字符串中。通常使用移动语义这是完全有效的,但当字符串使用SSO时它将失败。老实说相当令人烦恼。 - Bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接