2012-05-26 36 views
5

据我所知,你不应该在C++中通过引用传递简单的类型,因为它不会提高性能,它甚至对性能(?)不利。至少这就是我从网上收集的信息。不通过引用传递简单类型的原因?

但我不能找出原因为什么它是坏的表现,是不是因为它是对C更快++只创建一个新的简单类型比它实在是太抬头变量或者是什么呢?

+1

即使没有任何“性能”考虑因素,引用参数也会改变调用语义...... – 2012-05-26 23:07:09

+0

如果通过常量引用传递(编译器会将其转换为按值传递),我认为这是编译器优化。 –

回答

6

如果创建一个参考,它是:

pointer to memory location -> memory location 

如果您使用的值,它是:

memory location 

由于价值已经被复制任何一种方式(参照值或值) ,通过引用并不会提高性能;必须进行一次额外的查找。所以它理论上会“恶化”表现,但不是你会注意到的。

+0

这是一个误导性答案。 _“由于值必须以任一方式复制”_。通过ref传递不会导致复制值,而是在同一个对象上使用指针操作。所以传递'double'就意味着创建一个'double'的副本(如果它是一个左值)并在该函数中使用该副本。传递引用意味着您将指针传递给函数并执行解引用,无论何时使用该值,但不将该var放入堆栈。如果你有一个引用另一个具有值arg的引用的函数,那么只有第二个将在栈上分配var。 –

+0

@AdamHunyadi:通过引用传递结果会复制一个指针(直至优化)。这就是我所说的“价值”。 (您可以通过阅读引用部分后面的括号来判断。) – Ryan

0

内部引用在指针中处理,每次访问它们时都需要取消引用。这显然需要额外的操作。

+0

引用不是指针。你也不应该将引用看作指针(它只是让他们更难以思考)。 –

+0

我可以同意在本地范围内创建的引用,但是将东西传递给方法作为参考怎么办?如果你不通过值传递(阅读:把一个副本放在堆栈上),你唯一的选择就是传递一个指向被引用对象的指针。你必须通过堆栈或寄存器来传递某些东西,所以它必须是整个值或是一个指向它的指针。由于引用显然不是整个值,它们必须是指针。我更喜欢用C#和Java的“简单工作”方式来思考它们,但在内部它们像自动解引用的指针一样工作。 – Wormbo

+0

您现在将语言结构(指针/引用)映射到实现细节。这甚至没有用处。 –

0

例如,在32位模式下,int大小是4字节,而int *指针大小是4字节。 直接传递4个字节int比传递4个字节指针更快,然后通过该指针加载int

+0

@Loki Astari:某些配置中的参数总是从内存中加载(它应该是指针还是值),但是如果它是指针,那么内存中会有另一个加载,这并不适用于将值本身作为参数传递的情况。 – Ruben

2

这是一个很好的问题,而且你问的事实表明你正在关注你的代码。然而,好消息是,在这种特殊情况下,有一个简单的方法。

这由Dave Abrahms优秀的文章回答你所有的问题,然后一些:Want Speed? Pass by Value.

老实说,它不会做链接正义来概括它,它是一个真正的必读。但是,简而言之,您的编译器足够聪明,可以正确执行,如果您尝试手动执行,则可能会阻止编译器进行某些优化。