有时您希望将字符串添加到现有数据结构中。例如,C++17 模板“std::optional”可用于表示可能的字符串值。您可以将其复制到那里,因为这段代码通常会这样做……
标准::字符串mystring ;
std :: optional < std :: string > myoption ;
我的选项=我的字符串;
或者你可以移动它:
标准::字符串mystring ;
std :: optional < std :: string > myoption ;
myoption = std :: move ( mystring ) ;
在 C++ 中,当“移动”一个值时,编译器不需要创建一个全新的字符串副本。所以它通常更便宜。
我写了一个小基准来评估性能差异。这是一个单一的测试,但它应该说明。
首先,对于较长的字符串(一个短语或一个句子),移动速度要快 5 倍到 20 倍。
复制 | 移动 | |
苹果 LLVM 14,M2 处理器 | 24 纳秒/串 | 1.2 纳秒/串 |
GCC 11,英特尔冰湖 | 19 纳秒/串 | 4 纳秒/串 |
其次,对于短字符串(单个单词),移动速度要快 1.5 到 3 倍。
复制 | 移动 | |
苹果 LLVM 14,M2 处理器 | 2.0 纳秒/串 | 1.2 纳秒/串 |
GCC 11,英特尔冰湖 | 7 纳秒/串 | 2.6 纳秒/串 |
我的结果表明,移动您的大型数据结构而不是复制它们是有益的。
但这不是最快的方法:最快的方法是只持有一个指针。复制地址的速度无与伦比。一种不太理想的方法是使用像 std::string_view 这样的轻量级对象:复制或创建 std::string_view 比使用 C++ 字符串做同样的事情要便宜。
原文: https://lemire.me/blog/2023/01/30/move-or-copy-your-strings-possible-performance-impacts/