const参数与const参考参数

aia*_*iao 8 c++ optimization alias const reference

实施1:

foo(const Bar x);
Run Code Online (Sandbox Code Playgroud)

实施2:

foo(const Bar & x);
Run Code Online (Sandbox Code Playgroud)

如果在函数内不更改对象,为什么要复制它(实现1).

这将由编译器自动优化吗?

简介:即使对象const在函数声明中声明,仍然可以通过其他别名编辑对象&.

如果您是编写库的人并且知道您的功能没有这样做,或者该对象足够大以证明每次操作的解除引用成本, foo(const Bar & x);那么就是要走的路.

第2部分:

这将由编译器自动优化吗?

既然我们确定它们并不总是等价的,并且等价的条件是非平凡的,那么编译器通常很难确保它们,所以几乎肯定 没有

NPE*_*NPE 5

实际上,在这种情况下,您通常会使用方法2.

通常情况下,如果对象很小,您只会使用方法1,因此复制它一次比通过引用重复访问它更便宜(这也会产生成本).在TC++ PL中,Stroustrup开发了一个复数类,并将其传递给它,正是出于这个原因.


Che*_*Alf 5

你问,

“如果对象不会在函数内改变,你为什么要复制它(实现 1)。”

好吧,有一些奇怪的情况,通过引用传递的对象可能会被其他代码更改,例如

namespace g { int x = 666; }

void bar( int ) { g::x = 0; }

int foo( int const& a ) { assert( a != 0 );  bar( a );  return 1000/a; }  // Oops

int main() { foo( g::x ); }
Run Code Online (Sandbox Code Playgroud)

不过,自 1990 年代中期以来,这从未发生在我身上。

因此,对于该类型的单个参数,这种别名是一个理论问题

使用相同类型的两个参数,它更有可能成为现实。例如,赋值运算符可能会传递调用它的对象。当参数按值传递时(如交换习语的最小形式)没有问题,但如果不是,则通常需要避免自赋值

你进一步问,

“这会被编译器自动优化吗?”

不,不是一般的,出于上述原因

编译器通常不能保证引用参数没有别名(但是,一个例外是内联调用的机器代码)

然而,在第三一方面,语言可以设想通过提供程序员用一种方式来明确接受任何这样的优化支持在此,如编译器,比如,一种方法,说:“这个代码是安全的优化,通过更换通通过引用传递值,请随意,编译器”