大一学习C语言的时候,书上就写着a = a + b与 a += b等价,但是提倡用后者。

在CSDN上也看到一个关于a+=b和a=a+b的区别的帖子,大概内容如下:
------------------------------------------------------------------------------------------------------------------------------------------
楼主:为什么要强调使用   a+=b   而不建议使用a=a+b
我想在编译上应该是一样的啊
add   a   b
就算是间接寻址也应该一样啊

以下是各位高人的回答:

1 楼mLee79()回复于 2006-11-15 21:14:23 得分 0
打字快些,鉴定完毕   ...

6 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-15 22:03:26 得分 1
a+=b       这个性能高
作了优化

33 楼miniplayer(为了我的公主)回复于 2006-11-16 10:47:55 得分 0
少打一个a
故节省时间

41 楼Darc(注册真烦)回复于 2006-11-16 12:58:43 得分 0
可以少打一个a.
好处显而易见,第一,Coding速度提高一点点。第二,延长键盘上“A”键的寿命。
----------------------------------------------------------------------------------------------------------------------------------------------

今天在运行一段C++程序的时候,发现效率很低,经过不断的测试,最后发现是循环中的字符串连接(直接使用的a = a + b形式的连接方式)消耗了程序运行的大部分时间,上网查了一下C++中string的方法,有4种方法向string后面加字符和字符串(string a, b):

1. a = a + b;
2. a += b;
3. a.append(b);
4. push_back();    //这个的用法暂时还没去看。

然后我写了一个小程序来测试前三种方法的执行效率:
-------------------------------------------------------------------------------------------------------------------------------------------
string s1,s2,s3;
string str = "abc";

cout << "1 :" ; getTime();                  //时间1,第1个函数运行开始
for(int i = 0; i < n; i++)
{
s1 = s1 + str;
}

cout << "2 :" ; getTime();                  //时间2,第1个结束,第2个开始
for(int i = 0; i < n; i++)
{
s2 += str;
}

cout << "3 :" ; getTime();                  //时间3,第2个结束,第3个开始
for(int i = 0; i < n; i++)
{
s3.append(str);
}
cout << "4 :" ; getTime();                  //时间4,第3个函数运行结束
----------------------------------------------------------------------------------------------------------------------------------------------
当n = 100000的时候,结果如下:
[yurocy@localhost test_programme]$ ./string
1 : 2009/10/15 20:01:07
2 : 2009/10/15 20:01:10
3 : 2009/10/15 20:01:10
3 : 2009/10/15 20:01:10
第一个函数运行用了3秒钟,后面两个的时间可以忽略。

当n = 500000的时候,结果如下:
[yurocy@localhost test_programme]$ ./string
1 : 2009/10/15 20:13:00
2 : 2009/10/15 20:15:50
3 : 2009/10/15 20:15:50
3 : 2009/10/15 20:15:50
第一个函数居然用了2分50秒,后面两个的时间还是1秒以内。

当n = 1000000的时候,等了几分钟,第一个都没运行出来。

差别真是太大了。。。将程序中的 “+” 换成 “+=”,效率马上提高了好几倍。

当然,在Java里面也有这个问题,那就是String和StringBuffer的区别了。

C++的string连接(a = a + b 与 a += b)的更多相关文章

  1. Java中String连接性能的分析【转】

    [转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...

  2. Java中String连接性能的分析

    总结:如果String的数量小于4(不含4),使用String.concat()来连接String,否则首先计算最终结果的长度,再用该长度来创建一个StringBuilder,最后使用这个String ...

  3. python string 连接test

    def strTest(): name = "" for i in range(10): name += "hello" #print name def str ...

  4. 关于JAVA中的String的使用与连接(转)

    JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable).           String的不可变性是Ja ...

  5. 手把手实例对比String、StringBuilder字符串的连接效率及StringBuilder和StringBuffer线程安全的比较

    一.字符串连接的效率问题 使用String连接字符串时为什么慢? 小知识点 java中对数组进行初始化后,该数组所占的内存空间.数组长度都是不可变的. 创建一个字符串,为字符串对象分配内存空间,会耗费 ...

  6. 关于string,我今天科普的

    今天下午朋友讨论组上讨论一个关于string的问题,问题是这样的,string a="aaa";string b=a;a="bbb",为什么测试b的值不改变?之 ...

  7. String内存陷阱简介

    String 方法用于文本分析及大量字符串处理时会对内存性能造成一些影响.可能导致内存占用太大甚至OOM. 一.先介绍一下String对象的内存占用 一般而言,Java 对象在虚拟机的结构如下:•对象 ...

  8. jdk之String

    学习几个常用的String方法 1.concat /** * Concatenates the specified string to the end of this string. 连接指定的字符串 ...

  9. 自己实现的string的库函数

    为了更好地理解string的各个库函数,现将几个常用的库函数用自己的方式实现如下: #include<iostream> using namespace std; #include< ...

随机推荐

  1. 九度oj 题目1139:最大子矩阵

    题目描述: 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 ...

  2. Get 了滤镜、动画、AR 特效,速来炫出你的短视频开发特技!

    在滤镜美颜.搞怪特效.炫酷场景等各种新奇玩法驱动下,短视频开始让人上瘾. 12 月 3 日,七牛云联合八大短视频特效平台共同推出了中国短视频开发者创意大赛(China Short Video Cont ...

  3. 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj  ...

  4. 【bzoj3123】[Sdoi2013]森林 倍增LCA+主席树+启发式合并

    题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...

  5. 【Luogu】P1199三国游戏(博弈论)

    题目链接 来看一波有理有据的分析 三牧小明的那篇 代码 #include<cstdio> #include<cctype> #include<algorithm> ...

  6. spring aop在mvc的controller中加入切面无效

    spring aop在mvc的controller中加入切面无效 因为MVC的controller,aop默认使用jdk代理.要使用cglib代理. 在spring-mybatis.xml配置文件中加 ...

  7. json格式前端显示

    使用angular可以稍加修改. [转]http://web.jobbole.com/82865/ function output(inp) { document.body.appendChild(d ...

  8. iOS 收款计算器算法

    一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面 demo 在这里 https://github.com/L-vinCent/calculView_function 显示计算记录 不能连续 ...

  9. 487. Max Consecutive Ones II

    Given a binary array, find the maximum number of consecutive 1s in this array if you can flip at mos ...

  10. asp.net开发的调试方法集合

    调试是写代码一共非常重要的步骤,掌握好调试的技巧对于编程有事半功倍的效果,下面是我总结的菜鸟用方法 1.关于HTML和JS的调试 JS曾经是我最讨厌的错误,因为大多数错误VS不报错,这是因为js是解释 ...