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

时间:2014-08-15 23:05:35

标签: 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?另外,使用双引号或单引号如何影响串联速度?

1 个答案:

答案 0 :(得分:5)

s += "n";

这对字符串进行就地操作。可能不需要重新分配内存。但是字符串文字是以零结尾的字符序列,因此代码需要在&#39; n&#39;之后在内存中找到0值。

s += 'n';

这与第一个类似,但它使用字符文字而不是字符串文字。无需搜索0,因此可能更快。

s = s + "n";

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

s = s + 'n';

可能比前一个更快,但与堆上的临时对象创建和分配相比,搜索0最大可能导致的差异可以忽略不计。

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