cited from:
写在前面:
可能跟自己有些洁癖有关,一直以来都追求极致简洁的高效代码,在高效第一的前提下,追求代码的极致简洁。今天看到前辈的一个函数,里面就是简单的一个计算式,用一个局部变量存储计算式的结果,然后返回这个局部变量。总共就三行。我第一反应就是,如果不是考虑效率的话,为啥这样写?于是搜罗了一圈关于return的效率问题的资料,发现这种方式非但没有提高效率,反而降低了效率,因为中间需要copy操作。我能想到的这样写的原因,恐怕就是“日常思维”所致,当我们想实现一个数学函数时,脑海第一反应就是y=f(x),于是先声明一个局部变量y,然后写出表达式,最后返回这个y。如此coding更符合大家的日常思维,因此不但写起来顺手,读者读起来也顺眼。但,这并不一定让计算机“顺眼顺手”。我以为,当我们在coding时,就应该尽量把自己想象成一台计算机,用计算机的“思维”方式去coding,正如我们平时穿过一个公园时,我们会不由自主地尽可能直线地抄近道穿过,这是人的思维,而计算机的思维,应该是不由自主地以最小的资源消耗、最简洁的表达方式、最快速的处理方式,去实现一个目的,而非人们看起来最符合日常习惯的方式。
原文引用:
如果函数返回值是一个对象,要考虑return语句的效率。例如
return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它” 。不要以为它与“先创建一个局部对象 temp 并返回它的结果”是等价的,如
String temp(s1 + s2);
return temp;
实质不然,上述代码将发生三件事。首先,temp 对象被创建,同时完成初始化;然后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;最后,temp 在函数结束时被销毁(调用析构函数) 。然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了
效率。
类似地,我们不要将
return int(x + y); // 创建一个临时变量并返回它
写成
int temp = x + y;
return temp;
由于内部数据类型如 int,float,double 的变量不存在构造函数与析构函数, 虽然该 “临时变量的语法”不会提高多少效率,但是程序更加简洁易读。