std::string SSO 调整
std::string SSO tuning
是否可以通过某种方式调整 std::string
Small/Short String Optimization?
例如,如果我必须处理很多非常短但超过 15 个字符的字符串(例如 lastname + ", " + firstname + ", " + middlename
,其长度通常在 [20; 40]
范围内)。
更新:
根据 this 看来答案是否定的。但是当我打开 basic_string.h
文件时,我发现了这个:
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
...
enum { _S_local_capacity = 15 / sizeof(_CharT) };
union
{
_CharT _M_local_buf[_S_local_capacity + 1];
size_type _M_allocated_capacity;
...
};
所以现在还不清楚为什么 _S_local_capacity
是这样硬编码的...
"short string optimisation" 的整个想法是它“不需要额外的 space。因此计算大小使得本地缓冲区覆盖 class 中使用的其他变量当字符串更长时。
修改系统 headers 是个坏主意,因为它们通常依赖于编译器版本,并且有实现细节使其成为 "binary incompatible"。
正如评论所说,在采取任何措施之前确保这确实是一个问题(性能或其他方面)。然后仔细考虑你应该怎么做。你想解决什么问题,你确定这值得吗?请记住,如果您执行以下操作:
std::string func(std::string arg)
{
...
}
您将在堆栈上传递 arg
时复制更多字节。不,如果你的调用代码生成一个临时字符串,它并没有真正帮助 const std::string& arg
,例如func("Name: " + name);
。如果你这样做 vector<std::string>
,每个的大小会更大,所以向量会花费更多 space - 即使在字符串仍然不适合的情况下,所以会花费更多时间你 grow/shrink 向量。
而且我认为正确的解决方案是,一旦您做出决定,就是实施您自己的字符串 class。 std::string
是一个标准模板库 class,它们是不可扩展的,你不应该修改标准库 header 文件,正如我之前所说,它高度依赖编译器.使它与 std::string
完全兼容将是相当多的工作,但您当然可以 "cheat" 并为您的字符串 class 创建一个转换器函数 operator std::string()
,因此您只需要生成 std::string
提供的更基本的功能。
是否可以通过某种方式调整 std::string
Small/Short String Optimization?
例如,如果我必须处理很多非常短但超过 15 个字符的字符串(例如 lastname + ", " + firstname + ", " + middlename
,其长度通常在 [20; 40]
范围内)。
更新:
根据 this 看来答案是否定的。但是当我打开 basic_string.h
文件时,我发现了这个:
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
...
enum { _S_local_capacity = 15 / sizeof(_CharT) };
union
{
_CharT _M_local_buf[_S_local_capacity + 1];
size_type _M_allocated_capacity;
...
};
所以现在还不清楚为什么 _S_local_capacity
是这样硬编码的...
"short string optimisation" 的整个想法是它“不需要额外的 space。因此计算大小使得本地缓冲区覆盖 class 中使用的其他变量当字符串更长时。
修改系统 headers 是个坏主意,因为它们通常依赖于编译器版本,并且有实现细节使其成为 "binary incompatible"。
正如评论所说,在采取任何措施之前确保这确实是一个问题(性能或其他方面)。然后仔细考虑你应该怎么做。你想解决什么问题,你确定这值得吗?请记住,如果您执行以下操作:
std::string func(std::string arg)
{
...
}
您将在堆栈上传递 arg
时复制更多字节。不,如果你的调用代码生成一个临时字符串,它并没有真正帮助 const std::string& arg
,例如func("Name: " + name);
。如果你这样做 vector<std::string>
,每个的大小会更大,所以向量会花费更多 space - 即使在字符串仍然不适合的情况下,所以会花费更多时间你 grow/shrink 向量。
而且我认为正确的解决方案是,一旦您做出决定,就是实施您自己的字符串 class。 std::string
是一个标准模板库 class,它们是不可扩展的,你不应该修改标准库 header 文件,正如我之前所说,它高度依赖编译器.使它与 std::string
完全兼容将是相当多的工作,但您当然可以 "cheat" 并为您的字符串 class 创建一个转换器函数 operator std::string()
,因此您只需要生成 std::string
提供的更基本的功能。