它不保证是坏的。但在这个特定情况下,它是不必要的。
在许多(或大多数)上下文中,引用是作为伪装指针来实现的。你的例子恰好是这些情况之一。假设函数没有被内联,参数b
将作为指针在“引擎盖下”实现。所以,你真正通过setA
在第一个版本中是指针到int
,即提供间接访问您的参数值。在第二个版本中,您立即传递int
,即提供直接访问您的参数值。
哪个更好,哪个更差?那么,在许多情况下,指针的大小比int
大,这意味着第一个变体可能会传递更大量的数据。这可能被认为是“不好的”,但是由于两种数据类型通常都适合硬件字的大小,所以它可能没有明显的差别,特别是如果参数在CPU寄存器中传递的话。
此外,为了读b
是变相的指针,你必须取消引用函数内。从性能角度来看,这也是“不好的”。
这些是人们希望通过值传递任何小尺寸参数(小于或等于指针大小)的正式原因。对于参数或更大的尺寸,传递const引用变成一个更好的主意(假设你没有明确要求副本)。
然而,在大多数情况下,一个功能简单很可能会被内联,这将完全消除两个变体之间的差别,不管你使用的参数类型。
const
在第二个变体中是不必要的事情是一个不同的故事。 const
在第一个变体中有两个重要用途:
1)它阻止您修改参数值,从而保护实际参数不被修改。如果引用不是const
,则可以修改引用参数,从而修改参数。
2)它允许你使用rvalues作为参数,例如,致电some_obj.setA(5)
。没有那个const
这样的呼叫是不可能的。
在第二个版本中这两个都不是问题。没有必要保护修改后的实际参数,因为参数是该参数的本地副本。不管你对参数做什么,实际的参数都将保持不变。不管参数是否被声明为const
,您都可以使用rvalues作为参数SetA
。
因此,人们通常不会对通过值传递的参数使用顶级const
限定符。但是,如果您确实声明const
,它将阻止您修改函数内的本地b
。有些人确实喜欢这样做,因为它强制执行适度流行的“不要修改原始参数值”约定,因此有时可能会在参数声明中看到顶级const
限定符。
来源
2013-07-12 16:08:50
AnT
“他们告诉我不要用在下面的示例参考。但是,为什么?”他们不是说为什么吗?没有解释的理由,获取代码审查意见并不是很有用。你不能问他们为什么? –