[翻译] Effective C++, 3rd Edition, Item 20: 用 pass-by-reference-to-const(传 const 引用)取代 pass-by-value(传值)(下)

(点击此处,接上篇)

如如果你掀开编译器的盖头偷看一下,你会发现 references(引用)一般是作为 pointers(指针)实现的,所以以 by reference(传引用)方式传递某物实际上通常意味着传递一个 pointer(指针)。由此可以得出结论,如果你有一个 built-in typ(内建类型)的 object(例如,一个 int),以 by value(传值)方式传递它常常比 by reference(传引用)方式更高效。那么,对于 built-in typ(内建类型),当你需要在 pass-by-value(传值)和 pass-by-reference-to-const(传 const 引用)之间做一个选择时,没有道理不选择 pass-by-value(传值)。同样的建议也适用于 STL 中的 iterators(迭代器)和 function objects(函数对象),因为,作为惯例,它们就是为 passed by value(传值)设计的。iterators(迭代器)和 function objects(函数对象)的实现有责任保证拷贝的高效并且不受切断问题的影响。(这是一个“规则如何变化,依赖于你使用 C++ 的哪一个部分”的实例——参见 Item 1。)

built-in type(内建类型)很小,所以有人就断定所有的小类型都是 pass-by-value(传值)的上等候选者,即使它们是 user-defined(用户定义)的。这样的推理是不可靠的。仅仅因为一个 object 小,并不意味着调用它的 copy constructor(拷贝构造函数)就是廉价的。很多 objects ——大多数 STL containers(STL 容器)也在其中——容纳的东西比指针多不了什么,但是拷贝这样的 objects 必须同时拷贝它们指向的每一样东西。那可能是 very expensive(非常昂贵)的。

即使当一个小 objects 有廉价的 copy constructors(拷贝构造函数)时,也可能存在性能问题。一些编译器对 built-in(内建)的和 user-defined types(用户定义类型)并不一视同仁,即使他们有同样的底层表示。例如,一些编译器拒绝将仅由一个 double 组成的 objects 放入一个寄存器中,即使在常规上它们非常愿意将纯粹的 doubles 放入那里。如果发生了这种事情,你以 by reference(传引用)方式传递这样的 objects 更好一些,因为编译器理所当然会将一个指针(references(引用)的实现)放入寄存器。

小的 user-defined types(用户定义类型)不一定是 pass-by-value(传值)的上等候选者的另一个原因是:作为 user-defined(用户定义)的,它的大小常常会变化。一个现在较小的类型在将来版本中可能变得较大,因为它的内部实现可能会变化。甚至当你换了一个不同的 C++ 实现时,事情都可能会变化。例如,就在我这样写的时候,一些标准库的 string 类型的实现的大小就是另外一些实现的 seven times(七倍)。

通常情况下,你能合理地假设 pass-by-value(传值)廉价的类型仅有 built-in types(内建类型)及 STL iterator(迭代器)和 function object(函数对象)类型。对其他任何类型,请遵循本 Item 的建议,并用 pass-by-reference-to-const(传 const 引用)取代 pass-by-value(传值)。

Things to Remember

  • 用 pass-by-reference-to-const(传 const 引用)取代 pass-by-value(传值)。典型情况下它更高效而且可以避免 slicing problem(切断问题)。
  • 这条规则并不适用于 built-in types(内建类型)及 STL iterator(迭代器)和 function object(函数对象)类型。对于它们,pass-by-value(传值)通常更合适。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值