1.转交函数:
对于将任务传递给其他函数或对象时很有用,尤其当转交函数被设计的很高效时。
那么问题来了,如何设计高效的转交函数呢?
2. 如何设计高效的转交函数
有转交函数如下:
bool f(X x) {
return g(x);
}
改进一:传参时使用传const的引用代替原值(总被采用):
编译器能确保参数x除了传递给g()外没有被其他地方使用,编译器可以使x完全优化掉。例如:
X my_x;
f(my_x);
对于这样的代码,编译器可以这样处理:
a)产生一个my_x的拷贝供f()使用(就是f()的代码体中的形参x),然后将这个拷贝传给g();
b)直接将my_x传给g()而不生成拷贝,因为编译器注意到这个额外的拷贝除了作为g()的参数外根本没被使用;
像上面代码中的f函数,编译器被要求产生两份拷贝,当我们知道额外的拷贝是不需要的,通常的改进是将x申明为const X&型的参数。
改进二:函数内联(需要权衡)
默认情况下,将所有函数都实现为外联,有选择地将需要内联以提高效率的函数实现为内联。
将函数声明为内联时:
优点:
避免对f函数的调用的额外开销;
缺点:
内联f暴露了f的实现,并使得用户的代码依赖于此实现,当f发生改变时,所有用户代码都必须被重新编译。而且,用户代码也需要知道函数g()的原型,用户本没有直接调用函数g,原本不需要知道该函数的原型。这样的话,函数g()自身发生变化时,接受其他类型的其他参数时,用户代码也要知道这些类型的申明。
内联和非内联都可以,必须在优缺点间进行权衡。取决于f现在是怎样被使用的和使用的广泛程序,以及可以变为怎样被使用和使用的广泛程度。