注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

string + string  

2005-10-10 23:08:24|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
java中,不提倡用String类型连加来构造新的String,因为每加一次,都会构造出一个新的String实例,不仅时间费用高昂,而且占用内存。
 
那么c++在string类型连加时是怎么做的呢?以下是vc6+intel compiler 8编译后再反编译的代码:
 
13:       str3 = str1 + str2;
004011E5   lea         eax,[ebp-2Ch]
004011E8   push        eax
004011E9   lea         ecx,[ebp-1Ch]
004011EC   push        ecx
004011ED   lea         edx,[ebp-58h]
004011F0   push        edx
004011F1   call        @ILT+35(std::operator+) (00401028)
004011F6   add         esp,0Ch
004011F9   mov         dword ptr [ebp-60h],eax
004011FC   mov         eax,dword ptr [ebp-60h]
004011FF   mov         dword ptr [ebp-64h],eax
00401202   mov         byte ptr [ebp-4],3
00401206   mov         ecx,dword ptr [ebp-64h]
00401209   push        ecx
0040120A   lea         ecx,[ebp-3Ch]
0040120D   call        @ILT+50(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=)
00401212   mov         byte ptr [ebp-4],2
00401216   lea         ecx,[ebp-58h]
00401219   call        @ILT+120(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_st
 
15:       str3 = str1;
0040121E   lea         edx,[ebp-1Ch]
00401221   push        edx
00401222   lea         ecx,[ebp-3Ch]
00401225   call        @ILT+50(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator=)
16:       str3 += str2;
0040122A   lea         eax,[ebp-2Ch]
0040122D   push        eax
0040122E   lea         ecx,[ebp-3Ch]
00401231   call        @ILT+25(std::basic_string<char,std::char_traits<char>,std::allocator<char> >::operator+=
 
可以看到str3 = str1 + str2;产生的汇编要比str3 = str1; str3 +=str2;要多得多,因为operator +在返回时为了不改变str1和str2的内容,不得不产生一个新的临时string实例,str3通过赋值函数取得这个临时string的内容后,临时string被销毁(可以明显看到那个析构函数的调用)。
 
而后一种方法并没有在过程中产生临时变量,因此代码也要少很多。
 
可以看出,第一种方法依旧会增加程序的时间成本,但由于c++能及时回收临时变量(调用析构),因此并不会增加空间成本。而java因为只能通过垃圾回收机制回收临时变量,这个时间在程序中是不可控的,因此连加的形式不仅仅增加时间成本,空间成本的增加更为严重。
 
不过,虽然c++在处理string时足够快,但前一种方法毕竟会增加时间成本,因此,还是用第二种好,虽然看起来语句会多一些,而且比java中蹩脚的StringBuffer类的写法要好看很多,但是不会涉及第二个类。如果觉得写太多的语句不爽,还可以这样嘛:st4 = str1; str4.append(str2).append(str3);
  评论这张
 
阅读(233)| 评论(5)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017