我想知道是否:
//Let's say T is a big class with + operand implemented.
T add(T* one, T* two)
{
return *one + *two;
}
和
T add(T& one, T& two)
{
return one + two;
}
比这还要轻:
T add (T one, T two)
{
return one +two;
}
如果没有,那么为什么有人会使用指针或对象的引用而不是对象本身作为函数的参数,如果什么都不会改变对象的数据呢?
答案 0 :(得分:4)
对于灯光类型,即适合int
等寄存器的灯光类型,它没有任何区别,因为它们与指向它们的指针一样容易复制。实际上,额外的间接可能会损害性能,这就是为什么你应该避免在不需要的情况下引入它
但是,使用的类型复制起来可能很昂贵。每天的例子都是std::string
。引用避免了副本,并且在函数需要“重”对象的任何地方都受到青睐。
在函数模板中,在采用各种对象类型时,通常应使用引用,除非您确定所涉及的唯一类型是“light”,例如迭代器或标量。
但是这个规则的例外情况不太明显。考虑std::accumulate
:
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
此处,init
取值。原因很简单:在通常的实现中init
被修改,因为它是在计算中直接使用的 - 没有引入中间对象。
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first) {
init = init + *first; // Here
}
return init;
}
指针本身不应用于间接功能参数。它们用在C中,其中不存在引用。
答案 1 :(得分:4)
使用基本类型时,通过指针或引用传递它并不比通过值轻。但是如果它是一个大对象,则传递指针或引用将比传递值轻,因为复制大对象的开销。
答案 2 :(得分:3)
如果“更轻”意味着“效率更高”,那么答案(对于整数)是否定的 - 唯一一次通过指针或引用传递参数可能更有效率传递值是否是您传递的对象非常大(例如sizeof(theObjectType)明显大于4或8字节,这是指针的典型大小),或者如果对象的类具有复制构造函数,其实现计算量很大。请注意,当通过指针或引用传递时,CPU在访问数据时必须取消引用指针/引用,这不是完全免费的。
如果没有,那么为什么有人会使用指针或对象的引用 而不是对象本身作为函数的参数,如果没有 会改变对象的数据吗?
可能是他们想要向函数传达对象的特定实例而不是(仅)对象的内容。例如,如果传入指向特定全局对象的指针而不是在任何其他指针中传递的行为,则编写一个行为不同的函数(尽管是不好的做法)。
通过指针传递也为调用者提供了传入NULL作为参数的选项,如果您希望调用者能够指定“没有为此参数提供任何值”,这将非常有用。
答案 3 :(得分:1)
不,你的上一个版本是“更轻”。
但那是因为int
参数可以很容易地在堆栈上传递。对于较大的数据类型,类等,传递指针更有效。
此外,如果您需要更改函数内部其中一个参数的值,则需要一个指针(其中引用的类型)才能对其进行修改。
答案 4 :(得分:1)
答案常常是:取决于。
如果您想知道复制或通过引用传递是否更便宜或正确,请考虑以下事项:
与指向它的指针相比,复制对象的成本有多高 无论如何,根据参数的传递方式,有时可以省略副本。
对于int
,指针/引用最多不会更贵。
请记住,您可以随意掠夺通过值传递的参数,就像通过rvalue-reference传递的参数一样。
其他人则不然。
对于int
或其他不管理更昂贵资源的类型而言,这些考虑因素并非如此。
std::optional
如果没有,指针是语义错误的选择。无论如何,永远不要通过非const
指针或引用,除非它应该由函数修改。
此外,如果您对表现非常认真,始终衡量 请记住,大部分时间只花在代码的一小部分上。