gpt4 book ai didi

c++ - const 参数 vs const 引用参数

转载 作者:可可西里 更新时间:2023-11-01 18:25:42 28 4
gpt4 key购买 nike

实现 1:

foo(const Bar x);

实现 2:

foo(const Bar & x);

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

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

总结:即使对象在函数声明中被声明为const,仍然有可能通过其他别名&<编辑对象.

如果您是库的编写者并且知道您的函数不会那样做或者对象足够大以证明每次操作的取消引用成本是合理的,那么foo(const Bar & x); 是要走的路。

第 2 部分:

Will this be automatically optimized by the compiler?

由于我们确定它们并不总是等价的,并且等价的条件很重要,因此编译器通常很难确保它们,所以几乎可以肯定 没有

最佳答案

你问,

“If the object will not be changed within the function, why would you ever copy it(implementation 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 ); }

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

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

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

你进一步问,

“Will this be automatically optimized by the compiler?”

不,一般不会,因为上面提到的原因

编译器通常不能保证引用参数不会有别名(不过,一个异常(exception)是内联调用的机器代码)

然而,在第三方面,语言可以可以想象在这方面支持编译器,例如通过为程序员提供一种显式接受任何此类优化的方法,例如,一种说“通过将按值传递替换为按引用传递来优化此代码是安全的方法,请随心所欲,编译器”

关于c++ - const 参数 vs const 引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13918283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com