gpt4 book ai didi

c++ - 为什么要通过 const 引用而不是按值传递?

转载 作者:IT老高 更新时间:2023-10-28 14:00:39 25 4
gpt4 key购买 nike

据我了解:当您按值传递时,该函数会生成传递参数的本地拷贝并使用它;当函数结束时,它会超出范围。当您通过 const 引用传递时,该函数使用对无法修改的传递参数的引用。但是,我不明白为什么要选择一个而不是另一个,除非在需要修改和返回参数的情况下。如果你有一个没有返回任何内容的 void 函数,为什么要选择一个而不是另一个?

编辑:所以基本上通过 const 引用传递避免了复制对象。那么在什么情况下复制对象好呢?我的意思是,如果它一直在优化性能,为什么不一直使用 const 引用呢?

最佳答案

有两个主要考虑因素。一是复制传递的对象的开销,二是当对象是本地对象时编译器可以做出的假设。

例如在第一种形式中,在 f 的主体中,不能假设 ab 不引用同一个对象;所以 a 的值必须在任何写入 b 后重新读取,以防万一。在第二种形式中,a 不能通过写入 b 来更改,因为它是函数本地的,因此这些重新读取是不必要的。

void f(const Obj& a, Obj& b)
{
// a and b could reference the same object
}

void f(Obj a, Obj& b)
{
// a is local, b cannot be a reference to a
}

例如:在第一个示例中,编译器可能会假设本地对象的值在进行不相关的调用时不会改变。如果没有关于 h 的信息,编译器可能不知道该函数引用的对象(通过引用参数)是否未被 h 更改。例如,该对象可能是由 h 修改的全局状态的一部分。

void g(const Obj& a)
{
// ...
h(); // the value of a might change
// ...
}

void g(Obj a)
{
// ...
h(); // the value of a is unlikely to change
// ...
}

很遗憾,这个例子不是铸铁的。可以编写一个类,例如,在其构造函数中添加指向其自身的指向全局状态对象的指针,这样即使是类类型的局部对象可能也会被全局函数调用更改。尽管如此,仍然有更多机会对本地对象进行有效优化,因为它们不能直接通过传入的引用或其他预先存在的对象进行别名。

应该在实际需要引用语义的地方选择通过 const 引用传递参数,或者仅当复制参数的成本超过潜在别名的成本时才作为性能改进.

关于c++ - 为什么要通过 const 引用而不是按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582797/

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