是否有可能以某种方式调整std::string
Small/Short String Optimization?
例如,如果我必须使用很多非常短的字符串但长度超过15个字符(例如lastname + ", " + firstname + ", " + middlename
,其长度通常在[20; 40]
范围内)。
UPD:
根据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
以这种方式硬编码......
答案 0 :(得分:3)
“短字符串优化”的整个想法是“它不占用额外的空间。因此,计算大小使得本地缓冲区覆盖类中其他变量,这些变量在字符串较长时使用。
修改系统头是一个坏主意,因为它们通常依赖于编译器版本,并且存在使其“二进制不兼容”的实现细节。
正如评论所说,在做任何事情之前,确保这确实是一个问题(表现或其他)。然后仔细考虑你应该怎么做。你想解决什么问题,你确定它是值得的吗?请记住,如果您执行以下操作:
std::string func(std::string arg)
{
...
}
您将在堆栈上传递arg
时复制更多字节。不,如果您的调用代码创建一个临时字符串,例如,它就不会真正帮助它const std::string& arg
。 func("Name: " + name);
。如果你做vector<std::string>
,每个的大小会更大,所以向量将占用更多空间 - 即使对于字符串STILL不适合的情况,因此当你增长/收缩时会有更多的时间矢量。
我认为,一旦做出决定,正确的解决方案就是实现自己的字符串类。 std::string
是一个标准的模板库类,它们不是可扩展的,你不应该修改标准库头文件,就像我之前说过的那样,它依赖于编译器。要使它与std::string
完全兼容将会有一些工作,但你当然可以“欺骗”并为你的字符串类创建转换器函数operator std::string()
,所以你只需要产生更基本的std::string
提供的功能。