返回引用与返回值与返回std::move(obj)

2023-05-16

返回引用与返回值相比

返回引用与返回值相比有以下几个好处:

  • 减少内存开销:返回值需要在函数内部创建一个临时对象,然后将该对象的副本返回给调用者。这个过程需要分配内存、复制数据等操作,会增加内存开销和运行时间。而返回引用只需要返回一个指向已有对象的引用,不需要创建新的对象,因此可以减少内存开销和运行时间。

  • 避免对象拷贝:返回值需要将对象的副本复制到调用者的栈空间中,这个过程需要调用对象的拷贝构造函数,如果对象比较大或者拷贝构造函数比较复杂,会导致性能下降。而返回引用只需要返回一个指向已有对象的引用,不需要进行对象拷贝,因此可以避免对象拷贝带来的性能问题。

  • 支持链式调用:返回引用可以支持链式调用,即将多个函数调用连接在一起,形成一个连续的调用链。这种方式可以使代码更加简洁、易读,同时也可以减少对象的创建和销毁次数,提高代码的性能。

需要注意的是,返回引用也有一些潜在的问题,比如返回了一个指向已经被销毁的对象的引用,或者返回了一个指向私有成员的引用等。因此,在使用返回引用时需要特别小心,确保返回的引用是有效的、安全的,并且不会对对象的状态造成任何影响。

返回引用与返回std::move()相比

返回引用和返回 std::move() 都有各自的优缺点,具体使用哪种方式取决于代码的具体情况。

  • 返回引用的优点是可以避免对象的拷贝和内存分配,同时支持链式调用,代码也比较简洁易读。

  • 但是,返回引用需要确保返回的引用是有效的、安全的,并且不会对对象的状态造成任何影响,否则可能会导致程序崩溃或者产生不可预期的结果。

  • 返回 std::move() 的优点是可以避免对象的拷贝,同时可以将对象的所有权转移给调用者,从而提高代码的性能。

  • 但是,返回 std::move() 也需要确保被移动的对象不再被使用,否则可能会导致程序崩溃或者产生不可预期的结果。

因此,如果你需要返回一个对象的引用,并且该对象的生命周期与函数的生命周期相同,那么返回引用可能是更优雅的方式。
如果你需要返回一个对象,并且该对象的生命周期可以超出函数的生命周期,那么返回 std::move() 可能是更优雅的方式。
但是,无论使用哪种方式,都需要确保代码的正确性和安全性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回引用与返回值与返回std::move(obj) 的相关文章

  • 将文件移动到另一个目录的批处理文件

    我希望你能帮我解决这个问题 它可能已经被问过多次 我知道 但由于某种原因 我就是无法让它工作 我想将一些文件从 files 目录移动到根目录 例如 这些文件是 test1 txt test2 txt test3 zip test4 zip
  • “使用命名空间 std”有什么用? [复制]

    这个问题在这里已经有答案了 有什么用using namespace std 我希望看到外行术语的解释 using 你会用它 名称空间 用什么 一个命名空间 std The std命名空间 C 标准库的功能 例如string or vecto
  • C++17 中已弃用 std::is_literal_type

    根据参考参数 http en cppreference com w cpp 特质std is literal type http en cppreference com w cpp types is literal type在 C 17 中
  • noexcept 在派生类中的用法

    我在使用时遇到问题noexcept派生类上的说明符 更准确地说 当父类是抽象类时 具有protected构造函数 以下是我声明类的方式的示例 With a public基类中的构造函数 一切正常 与相同的代码protected并且派生类不再
  • 是否可以按值删除队列元素?

    我想从队列中删除具有特定值的元素 这样的事该怎么办呢 我正在尝试创建映射和队列的并发混合 目前我尝试在这个答案 https stackoverflow com questions 7704526 is thare in stl or boo
  • 使用常量引用删除引用

    对于参数类 C 我希望始终获得 原始 类型 而不管指针 const 或引用修饰符如何 template
  • 特定于平台的 std::chrono::high_resolution_clock::period::num

    我注意到了std chrono high resolution clock period num 1对于我测试过的每个系统 是否存在任何系统 嵌入式 桌面 移动或其他 它恰好是其他数字 在这样的系统上 1 秒不能用刻度来表示 有以下三种实现
  • 为什么 c++ std::min 在 O0 上编译时不能使用静态字段作为其参数?

    同样的代码 用O0编译 会报错 Name test cpp Author Version Copyright Your copyright notice Description Hello World in C Ansi style inc
  • 我们可以依靠减少容量的技巧吗?

    它真的能保证以下减少容量的技巧在任何地方都能 起作用 吗 int main std string s lololololol s capacity still non zero string s swap s 它似乎对我来说 不起作用 因为
  • 如何散列 std::string?

    我正在制作一个小实用程序来帮助我通过重复来记住密码 我想每天只输入一次密码 而不是在每次会话之前输入 当然 我不会存储密码本身 但很乐意存储其哈希值 那么 获取哈希值的最简单方法是什么std string使用 C 标准库 对于不涉及外部库的
  • 为什么 std::type_info 不可复制?我可以把它存放在某个地方吗?

    The std type info类是不可复制的 这使得很难将其存储在对象中以供以后使用 我应该怎么办 C 11 中有一个更好的解决方案 一个名为 std type index 的新可复制包装器 您需要包含标头 typeindex 才能使用
  • 包中涉及std::transform的Rcpp代码的兼容性

    我正在完成我一直在做的一个包 所有检查看起来都很好 并且在我的计算机上编译没有问题 win builder包裹也没有问题 作为进一步检查 我尝试在同事的计算机上从源代码安装 但失败了 问题来自于我从中获取的 Rcpp 函数Rcpp 中关于向
  • std::move 与 std::make_pair

    之间有什么区别 std map
  • 为什么我不能在 C++ 中的 `std::map` 中存储引用?

    我知道引用不是指针 而是对象的别名 但是 我仍然不明白这对我作为程序员到底意味着什么 即幕后的引用是什么 我认为理解这一点的最好方法是理解为什么我无法在地图中存储参考 我知道我需要停止将引用视为指针的语法糖 只是不知道如何 按照我的理解 引
  • 将 uint64_t 转换为 std::string

    如何将 uint64 t 值传输到 std string 我需要构造包含该值的 std string 例如这样的事情 void genString uint64 t val std string str some code for str
  • 使用accumulate计算数组double[]平均值的函数

    它一定是最常见的函数 每个人在某处都有代码片段 但我实际上花了不少于 1 5 小时在 SO 以及其他 C 网站上搜索它 但还没有找到解决方案 我想计算 a 的平均值double array 使用函数 我想将数组作为函数传递给参考 有数百万个
  • 值类型不完整的映射

    我收到以下错误 class Test std map
  • 为什么我收到 string does not name a type 错误?

    game cpp include
  • 移动构造函数和 std::move 混淆

    我正在阅读有关std move http en cppreference com w cpp utility move 移动构造函数和移动赋值运算符 说实话 我现在得到的只是困惑 现在我有一堂课 class A public int key
  • 错误 C2039:“find”:不是“std”的成员

    我刚刚遇到一个奇怪的错误 它说 find 不是 std 的成员 错误 C2039 find 不是 std 的成员 错误 C3861 查找 未找到标识符 基本上 我想查找是否可以在向量中找到字符串 知道为什么会发生这种情况吗 代码帮助告诉我

随机推荐