c++ - 为什么某些类型的字符串连接明显快于其他类型?

标签 c++ string

考虑以下四种情况:

#include <string>
int main()
{
    std::string s("Hi I'm Da");

 1. s += "n";
 2. s += 'n';
 3. s = s + "n";
 4. s = s + 'n';

    return 0;
}

运行 test suite通过调用:

g++ -std=c++11 -O3 -DVER=case -Wall -pedantic -pthread test.cpp -o test

使用 g++ 版本 4.8.3 20140624,我得到以下结果:

2.16172ms
0.48296ms
510.202ms
510.455ms

现在我可以理解 += 更快是因为你没有在赋值之前使用 + 进行复制,但是为什么情况 1 和 2 显示出显着差异与案例 3 和案例 4 相比?另外,使用双引号或单引号如何影响连接速度?

最佳答案

s += "n";

这对字符串进行就地操作。有可能不需要重新分配内存。但是字符串字面量是以零结尾的字符序列,所以代码需要在内存中找到'n'之后的0值。

s += 'n';

这类似于第一个,但它使用字 rune 字而不是字符串文字。不用找0,可能会更快。

s = s + "n";

搜索 0 是有的,但更重要的是 - 必须构造新的临时字符串对象,而且很可能这意味着内存分配,这是一个数量级或更昂贵的。

s = s + 'n';

可能比上一个要快,但与在堆上临时创建和分配对象相比,搜索 0 造成的差异很可能可以忽略不计。

注意所有“可能”和“可能”。我所描述的可能会发生在流行的编译器中,但各种优化可能会完全改变情况。

关于c++ - 为什么某些类型的字符串连接明显快于其他类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25335395/

相关文章:

java - 如何在 Java 中解析这个字符串?

c++ - 根据值对 map 进行排序

C++ 在快速排序函数中获取 StackOverflow 错误

c++ - ptr to std::variant 总是== ptr to its alternatives之一吗?

c++ - 在发布版本中保留调试符号有缺点吗?

python - 从python中的字符串中提取罗马数字

c++ - 从函数返回类指针

string - 如何在 Haskell 中通过列表理解正确生成字符串列表?

java - 将字符串拆分为指定长度的 block (最后一个除外)

java - 查找字符串中的字符在java中重复了多少次