C++ articles:Guru of the Week #2 --临时对象(1)
作者:Hub Sutter译者:plpliuly
/*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第二篇,原文的版权是属于Hub Sutter(著名的C++专家,"Exceptional C++"的作者)。此文的翻译没有征得原作者的同意,只供学习讨论。——译者*/
#2 临时对象难度:5/10
不必要的临时对象常常导致代码冗余和执行效率低下。
问题: 假设你正在看一段代码,代码中有如下一个函数。这个函数中至少有3处产生了不必要的临时对象。 看看你能够找出几处,该怎样修改? string FindAddr( list<Employee> l, string name ) { for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ ) { if( *i == name ) { return (*i).addr; } } return ""; }
答案: 不管你信不信,就在这寥寥几行代码里出现了三处明显的不必要的临时对象,两处不太明显的临时对象,还有一处值得注意的地方。 string FindAddr( list<Employee> l, string name ) ^^^^^^^1^^^^^^^^ ^^^^^2^^^^^ 1&2.参数应该是const引用类型.上述语句中的传值参数会导致list和string的拷贝操作,这可能是很耗时的。 [准则]尽量使用const&来代替值拷贝传递参数。 for( list<Employee>::iterator i = l.begin(); i != l.end(); i++ ) ^3^ 3.此处比上两处稍难看出。此处如果用前自增操作代替后自增的将更有效率,因为对象的后自增操作需要对象执行自增操作并返回一个自增前原值的临时对象(译者:重载过前自增和后自增操作符的读者应该都清楚二者的区别)。注意这种情况对于象int这样的C++原始类型也是适用的。