避免使用“return”语句复制对象

2023-12-07

我有一个关于 C++ 的非常基本的问题。 返回对象时如何避免复制?

这是一个例子:

std::vector<unsigned int> test(const unsigned int n)
{
    std::vector<unsigned int> x;
    for (unsigned int i = 0; i < n; ++i) {
        x.push_back(i);
    }
    return x;
}

据我了解 C++ 的工作原理,该函数将创建 2 个向量:本地向量 (x) 和将返回的 x 的副本。有没有办法避免复制? (而且我不想返回指向对象的指针,而是返回对象本身)


使用“移动语义”(在评论中说明)的该函数的语法是什么?


对于 RVO(返回值优化)的工作原理似乎有些混乱。

一个简单的例子:

#include <iostream>

struct A {
    int a;
    int b;
    int c;
    int d;
};

A create(int i) {
    A a = {i, i+1, i+2, i+3 };
    std::cout << &a << "\n";
    return a;
}

int main(int argc, char*[]) {
    A a = create(argc);
    std::cout << &a << "\n";
}

其输出为ideone:

0xbf928684
0xbf928684

令人惊讶吗?

其实这就是RVO的效果:物体待退回是直接构造的in place在呼叫者中。

How ?

传统上,调用者 (main这里)将在堆栈上为返回值保留一些空间:返回槽;被调用者(create这里)(以某种方式)传递了返回槽的地址以将其返回值复制到其中。然后,被调用者为局部变量分配自己的空间,在其中构建结果,就像任何其他局部变量一样,然后将其复制到返回槽中return陈述。

当编译器从代码中推断出该变量可以直接构造到返回槽具有等效的语义(as-if 规则)。

请注意,这是一种常见的优化,它已被标准明确列入白名单,并且编译器不必担心复制(或移动)构造函数可能产生的副作用。

When ?

编译器最有可能使用简单的规则,例如:

// 1. works
A unnamed() { return {1, 2, 3, 4}; }

// 2. works
A unique_named() {
    A a = {1, 2, 3, 4};
    return a;
}

// 3. works
A mixed_unnamed_named(bool b) {
    if (b) { return {1, 2, 3, 4}; }

    A a = {1, 2, 3, 4};
    return a;
}

// 4. does not work
A mixed_named_unnamed(bool b) {
    A a = {1, 2, 3, 4};

    if (b) { return {4, 3, 2, 1}; }

    return a;
}

在后一种情况 (4) 中,当以下情况时不能应用优化:A由于编译器无法构建而返回a在返回槽中,因为它可能需要它来做其他事情(取决于布尔条件b).

一个简单的经验法则是:

如果在返回时间之前没有宣布其他候选人,则应适用 RVOreturn陈述。

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

避免使用“return”语句复制对象 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 延迟但不禁用 iPhone 自动锁定

    我目前有一个非常简单的应用程序 唯一的交互就是摇动 iPhone 然而 由于 iPhone 没有收到任何触摸事件 屏幕最终会变暗并自动锁定 我想知道是否有办法重置震动时自动锁定超时 我知道要完全禁用自动锁定 我会这样做 UIApplicat
  • 如何使用正则表达式查找特定匹配并将它们放入字符串数组中?

    我有一个 HTML 文件 我正在尝试从中提取数据 我使用的正则表达式是
  • 删除 arrayList 中的元素后出现 InvalidOperationException [重复]

    这个问题在这里已经有答案了 您好 我正在尝试从 arrayList 中删除所有可被 2 整除的数字 问题是 删除一个元素后 我得到一个 InvalidOperationException private ArrayList RemoveDi
  • 如何从文本文件中读取数百万行并快速插入表中

    我已经经历了快速向 SQL Server 插入 200 万行链接并发现我可以通过使用批量插入来做到这一点 所以我试图创建数据表 代码如下 但由于这是一个巨大的文件 超过 300K 行 我得到一个OutOfMemoryEexception在我
  • Y86汇编全局变量

    我正在努力让全局变量为我的 Y86 作业正常工作 不幸的是 我们提供的唯一示例是 IA 32 组件 我过去几个小时一直在寻找 但没有结果 这是我知道的非常基础的知识 但我在 Y86 完全是新手 我 声明 我的变量如下 align 4 x l
  • MySQL-自动递减值

    假设我有一个表 像这样 id 是自动递增的 id col1 col2 1 msg msg 2 lol lol2 3 xxx x 现在 我想删除第 2 行 我得到这样的结果 id col1 col2 1 msg msg 3 xxx x 问题是
  • 如何将某些内容注入到表单中

    从play 2 4 0开始 我们可以使用DI框架 我正在尝试在我的应用程序中使用 DI 我将 jpa 查找器从模型类上的静态方法移至注入控制器的服务层中的方法 我的主要问题是我有一些带有验证方法的表单 并且在我的验证方法中我使用了一些查找器
  • 让 ReSharper 尊重您对代码顺序的偏好

    与我的另一个问题相关 布局 C 类的最佳方式是什么 ReSharper 中有没有办法定义您希望成员的顺序 以便 ReSharper 维护它 From 这个答案 检查下类型成员布局 in Options 在下面C 节点 这并不简单 但可以更改
  • 如何使用 R 创建分组条形图[重复]

    这个问题在这里已经有答案了 我正在尝试使用 R 创建分组条形图 我尝试使用以下代码来创建一个简单的条形图 x c 99 9 104 67 86 53 83 29 127 31 179 86 74 80 100 150 68 18 81 47
  • Delphi 中重载记录的隐式转换作为 const 数组中的参数

    作为 Delphi 7 转换的一部分 我们摆脱了 ShortString 我想让它尽可能轻松 所以我们认为我们可以将 ShortString 更改为一些以相同方式起作用的记录 这是它的声明方式 还有更多内容 但这是基本结构 概述了问题 TS
  • 用ANTLR解析Java代码“需求概念”

    我正在尝试使用 ANTLR 进行程序编译 我使用 Java 编程语言作为目标 问题的核心是开发 Intent Regornizer 来纠正错误并改进源代码 如果源代码不符合 语法 在 ANTLR 的教程和书籍上 我看到如何编译一个简单的代码
  • 订单状态完成时更改购买特定产品的用户角色

    因此 我帮助某人启动了一个网站 当有人购买特定产品时 他们想要折扣产品 我找到了一个解决方案并实施了它 它在网站启动时发挥了作用 并且不再改变客户在购买产品时的角色 我试图获得 Woothemes 的支持 但他们不支持定制 并希望他们购买
  • 将存储过程结果导出到表中

    我有以下存储过程 可以根据某些条件生成 SQL 语句 我希望 SQL 语句也将实际结果返回到表中 CREATE TABLE dbo Rejects Report Year varchar 100 NULL COS Country Code
  • 通过无障碍服务禁用热词检测

    我创建了一个可访问的服务来保存每条 toast 消息 但现在如果我激活我的服务 Google Now 中的热词检测将被禁用 Logcat 显示 W HotwordState suspended 11001001000000 在 Google
  • 平衡可变长度lookbehind中的组[重复]

    这个问题在这里已经有答案了 TL DR 在 NET 的lookbehinds 中使用捕获 特别是平衡组 会更改获得的捕获 尽管它不会产生任何影响 NET 的lookbehind 是什么破坏了预期的行为 我试图找到一个答案这另一个问题 作为玩
  • 可以使用exams2nops中的解决方案模板吗?

    当我尝试使用以下命令生成考试解决方案时exams2nops template solution 我收到以下错误消息 Error in exams2pdf file n n nsamp nsamp dir dir name name form
  • RatingBar 中的步长

    RatingBar 中的步长是多少 这是我在文档中找到的 该评级栏的步长 例如 如果需要半星粒度 则该值为 0 5 我试图在这里找到它 https developer android com reference android widget
  • 如何通过iOS SDK中的iPad Camera Connection Kit读取SD卡内容?

    我想通过iOS SDK中的iPad Camera Connection Kit读取SD卡内容 该怎么做 有代码示例吗 Thanks 没有官方 API 可以做到这一点 在越狱设备上可能是可能的 但不使用官方 sdk
  • 在工作线程中使用 std::atomic_flag 时出现问题

    抱歉啰嗦了 我尽了最大努力将我的代码示例压缩成一个最小的功能类并且main method 我正在尝试使用atomic flag通知 rx 在我的工作线程中退出时stop 叫做 我相信问题在于尝试创建我的工作线程 thread SanityT
  • 避免使用“return”语句复制对象

    我有一个关于 C 的非常基本的问题 返回对象时如何避免复制 这是一个例子 std vector