Exceptional C++ Item46:转交函数(forwarding function)

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现在是怎样被使用的和使用的广泛程序,以及可以变为怎样被使用和使用的广泛程度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值