Stroustrup在函数中传递参数的指导原则

时间:2014-01-06 15:41:41

标签: c++ c++11

这些是Stroustrup在他最新的C ++书中提供的指南 在函数中传递参数:

[1] Use pass-by-value for small objects.
[2] Use pass-by-const-reference to pass large values that you don’t need to modify.
[3] Return a result as a return value rather than modifying an object through an argument.
[4] Use rvalue references to implement move (§3.3.2, §17.5.2) and forwarding (§23.5.2.1).
[5] Pass a pointer if ‘‘no object’’ is a valid alternative (and represent ‘‘no object’’ by nullptr).
[6] Use pass-by-reference only if you have to.

我的问题:

1)他没有解释[1]中“小物件”的含义。该规则适用于内置 类型,但我不确定用户定义的类型。用户定义的“小”程度如何 类型必须是作为规则[1]传递的?

2)我认为规则[3]只是一种风格问题。我错了吗?

3)我想知道为什么要统治[6]。为什么Stroustrup讨厌引用参数? :)(开玩笑)

谢谢

1 个答案:

答案 0 :(得分:4)

小的小尺寸因环境而异。请注意,规则(1)只是规则(2)的覆盖 - 如果您的对象很小并且,那么按{em>代替传递const&不想修改它。请注意,在此上下文中,对象的大小更多地与复制它的成本有关,而与sizeof的关联较少。在复制数据时复制兆字节数据的1字节对象不是一个小对象。

返回而不是修改可以比通过引用修改更严格。各种省略机制(包括NRVO和RVO)可以导致事物直接构建。您的代码也可以避免在输入参数中检查非空状态并清除它们。

规则4和1可以互动:如果你打算“复制”你传入的内容,即使对象很大,你也应该经常在参数列表中进行复制,而不是在功能。这几乎与进行多次完美重载一样有效(只要你的move操作有效,它就会在最坏的情况下增加1次。