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

天地不仁,以万物为Googol!

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

 
 
 

日志

 
 

字符串参数的高效转递  

2006-12-14 22:24:59|  分类: 积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

嗯,这个星期过的真是充实。充实过后,还是要有总结。

今天突发灵感,想到了一种高效传递字符串参数的方法。

首先要说的,直接使用原生字符串实在是危险(这里省略数万字的描述),因此,尽可能的使用封装好的字符串类,比如std::string。

由于类的拷贝成本很高,因此在函数间传递类实例时,一般都用常熟引用的方式来传递,比如:

void func(const std::string &arg);

但这种方式的缺点在于无法与字符串常量配合使用,比如:

func("this can't compile!");

因为字符串常量是原生字符串,并不是std::string类型,且由于这里需要引用实例,因此程序无法编译。

今天想到的一种简单的解决办法,是利用c++的重载机制实现对字符串常量的支持。比如:

void func(const char *arg);

viod func(const std::string &arg);

编译器会根据参数的不同,调用不同的函数。同时,每个函数的参数都只复制一个指针,达到高效的目的。同时,为了统一两个函数的效果,可以让一个函数调用另一个,比如:

当const char*版本实现效率更高时:

void func(const std::string &arg) { func(arg.c_str()); }

void func(const char *arg);

当const std::string版本实现的效率更高时:

void func(const char* arg) { std::string tmp(arg); func(tmp); }

void func(const std::string &arg);

或者,为了效率,为两个函数分别做不同的实现。

或许你会想到,如果需要在函数内部修改字符串值,依旧可以这么做:

void func(std::string &arg);

void func(char *arg); // careful

但由于字符串常量是不可修改的,因此这么做实际没有什么特别的意义:因为要修改字符串的值,那么必需要存在一个可以修改的字符串。而新加入的char *版的函数,很有可能会导致错过一些本该在编译期发现的错误。

另外,如果想取得一份字符串的副本,依旧可以定义:

void func(std::string arg);

因为需要一份副本,即使使用原生字符串也需要一次复制,何不让编译器自动处理呢?

ps1 前天晚上回家,在木樨地看到一辆马自达RX-8,不知道是不是车展上的那辆。那辆俺还上去坐了半天呢。

ps2 明天考杆

  评论这张
 
阅读(642)| 评论(3)
推荐 转载

历史上的今天

评论

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

页脚

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