gpt4 book ai didi

c++ - 返回 const 引用是否更有效

转载 作者:可可西里 更新时间:2023-11-01 16:24:19 25 4
gpt4 key购买 nike

例如

其中最好的是:

std::string f() {} 

const std::string& f() {}

最佳答案

函数不应返回对局部对象/变量的引用,因为此类对象超出范围并在函数返回时被销毁。

不同的是,函数可以返回一个对象的常量或非常量引用,其范围不受函数上下文的限制。典型的例子是自定义 operator<< :

std::ostream & operator<<(std::ostream &out, const object &obj)
{
out << obj.data();
return out;
}

不幸的是,按值返回有其性能缺陷。正如 Chris 提到的,按值返回对象涉及临时对象的拷贝及其后续销毁。复制通过复制构造函数或 operator= 进行。 .为了避免这些低效率,智能编译器可能会应用 RVO 或 NRVO 优化,但在某些情况下它们不能应用 -- 多重返回。

即将在 gnu gcc-4.3 中部分可用的 C++0x 标准引入了右值引用 [&&],可用于区分左值和右值引用。通过这种方式,可以实现移动构造函数,这对于返回一个对象很有用,部分避免了复制构造函数和临时析构函数的成本。

移动构造函数基本上是 Andrei 多年前在文章 http://www.ddj.com/database/184403855 中设想的。克里斯建议。

移动构造函数具有以下签名:

// move constructor
object(object && obj)
{}

它应该取得所传递对象内部的所有权,使后者处于默认状态。通过这样做,避免了内部拷贝,并且使临时文件的破坏变得容易。典型的函数工厂将具有以下形式:

object factory()
{
object obj;
return std::move(obj);
}

std::move()从对象返回右值引用。最后但并非最不重要的一点是,移动构造函数允许通过右值引用返回不可复制的对象。

关于c++ - 返回 const 引用是否更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275795/

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