Qt 的QString
s 可以连接起来,通过operator%
它使用表达式模板来预先计算结果字符串的大小并优化对operator+
. 有关更多信息,请参阅我的这个问题。
为什么没有std::basic_string
采用类似的结构?这甚至允许每个 C++11 吗?我只看到了优点,并且很明显,库实现者可以在他们想要的时候破坏 ABI 兼容性(C++11 甚至为 libstdc++ 提供了一个很好的理由)。
因为没有人为标准提出它;除非有人提出建议,否则它不会进入。另外因为它可能会破坏现有代码(如果他们使用operator+
它的话)。
此外,表达式模板在auto
. 做一些简单的事情auto concat = str1 % str2;
很容易被打破。希望这是 C++17 将通过某种方式解决的问题。
在 C++11std::basic_string
中支持移动语义,这意味着您可以通过为系列中的第一个字符串分配内存来优化一系列字符串的连接operator+
,然后在第一个字符串的内存中简单地构造其余字符串。系列,大大减少了连接和返回一系列字符串所需的内存分配和副本的数量。
我敢肯定,正如您使用 Qt 的方法所指出的那样,可以进行进一步的优化,但是 C++11 允许的移动语义克服了 C++03 版本中存在的巨大性能障碍std::basic_string
,尤其是当将很多字符串连接在一起时。
例如,像
std::string a = std::string("Blah blah") + " Blah Blah " + " Yadda, Yadda";
可以通过为第一个字符串分配内存,然后使用移动语义来完成,从第一个字符串“窃取”剩余内存以就地构造后两个字符串,并且只有在用完额外的内存时才重新分配内存空间。最后,赋值运算符可以使用移动语义从赋值运算符右侧创建的临时 r 值中“窃取”内存,从而防止连接字符串的副本。