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

 井然洞中别样天 发布于 2022-12-27 16:17

考虑以下四种情况:

#include 
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;
}

使用调用运行此测试套件:

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 个回答
  • s += "n";
    

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

    s += 'n';
    

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

    s = s + "n";
    

    搜索0是存在的,但更重要的是 - 必须构造新的临时字符串对象,并且很可能意味着内存分配,这是数量级或更高成本.

    s = s + 'n';
    

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

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

    2022-12-27 16:19 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有