在 C++ 中,从函数返回向量仍然是不好的做法吗?

2023-12-05

简洁版本:在许多编程语言中,返回大型对象(例如向量/数组)是很常见的。如果类有移动构造函数,这种风格现在在 C++0x 中是否可以接受,或者 C++ 程序员是否认为它很奇怪/丑陋/令人厌恶?

长版:在 C++0x 中,这仍然被认为是不好的形式吗?

std::vector<std::string> BuildLargeVector();
...
std::vector<std::string> v = BuildLargeVector();

传统版本如下所示:

void BuildLargeVector(std::vector<std::string>& result);
...
std::vector<std::string> v;
BuildLargeVector(v);

在较新的版本中,返回的值是BuildLargeVector是一个右值,因此 v 将使用以下的移动构造函数来构造std::vector,假设 (N)RVO 没有发生。

即使在 C++0x 之前,由于 (N)RVO,第一种形式通常也是“高效的”。但是,(N)RVO 由编译器自行决定。现在我们有了右值引用保证不会发生深复制。

Edit:问题确实不是关于优化。所示的两种形式在实际程序中具有几乎相同的性能。然而,在过去,第一种形式的性能可能会差几个数量级。因此,第一种形式长期以来一直是 C++ 编程中的主要代码味道。我希望不再这样了?


戴夫·亚伯拉罕斯(Dave Abrahams)对以下问题进行了相当全面的分析:传递/返回值的速度.

简短的回答,如果您需要返回一个值,那么就返回一个值。不要使用输出引用,因为编译器无论如何都会这样做。当然有一些警告,所以你应该阅读那篇文章。

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

在 C++ 中,从函数返回向量仍然是不好的做法吗? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

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

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • Powershell 中的 RegKey 问题

    我在使用 Powershell 中的注册表项时遇到问题 密钥 T E S T 由未知进程生成 然后我尝试使用以下方法覆盖它 Path setting grouplocators Name T E S T New Item Path Path
  • 如何从串行 python 脚本使用 mpi4py 应用程序

    我尝试制作一个基于 mpi4py 的库 但我想在串行 python 代码中使用它 python serial source py 但里面序列源 py存在一些名为的函数平行杆 from foo import parallel bar Can
  • C++ 动态分配 std::map 比较器

    因此 我有两个包含 std map 成员的类 其功能实际上相同 只是一个映射的顺序是 std less 另一个映射的顺序是 std greater 如果我创建一个抽象父类并声明一个映射成员 是否有任何方法可以在派生类构造函数中动态分配该成员
  • as3 文本字段更改字符串值

    我是Flash中as3的新手 我需要显示警报 在警报框中显示的文本字段如下 ou ra ro la atio hata 但我想显示的真实文本就像 鼠标拖放播放动作哈塔 在代码对中 文本字段类似于 鼠标拖放播放动作哈塔 当我调试代码时 我也看
  • UIWebView 仍然存在于 Google 移动广告中

    我正在尝试为 IOS 构建 但上传到 ITuneconnect 后收到此消息 ITMS 90809 已弃用的 API 使用 不再接受使用 UIWebView 的新应用程序 相反 使用 WKWebView 可以提高安全性和可靠性 了解更多 h
  • Google App Engine 中的进度条

    我有一个 Google App Engine 应用程序 它对远程 API 执行大约 30 50 次调用 每次调用大约需要一秒钟 因此整个操作很容易需要一分钟 目前 我在站点的 post 函数内循环执行此操作 因此在整个操作完成之前不会打印响
  • Visual Studio 2010 中缺少 asp.net Web 应用程序模板

    我安装了 Visual Studio 2010 终极版 当我单击 新建项目 gt Visual Basic 或 C gt Web 时 我得到的唯一选项是 AjaxControlExtender AjaxServerControl 和 ASP
  • Java“虚拟机”与Python“解释器”的说法?

    似乎很少读到 Python 虚拟机 而在 Java 中却一直使用 虚拟机 两者都解释字节码 为什么称一个为虚拟机而另一个为解释器 在本文中 虚拟机 指的是进程虚拟机 而不是指 系统虚拟机 例如 Qemu 或 Virtualbox 进程虚拟机
  • 在 HTML 中为 target="_blank" 打开新窗口

    a href facebook com sharer target blank Share this a 当用户单击它时 如何在新窗口中使其具有一定的宽度和高度 在firefox中 当前代码仅打开一个新选项卡 而不是新窗口 要在包含尺寸和所
  • 如何在 ibm worklight 中打开本机相机

    Ibm Worklight 有调用本机应用程序的示例 但它是在 worklight 本身中创建的 例如 此示例中的 module 09 1 Android CombiningNativeAndWebPages 在 android 文件夹本身
  • 是否可以从另一个容器启动已停止的容器

    有两个容器A和B 一旦容器A启动 就会执行一个进程 然后容器就会停止 容器 B 只是一个 Web 应用程序 比如expressjs 是否可以从容器 B 启动 A 可以授予容器对 docker 的访问权限 以便它可以在主机上生成其他容器 您可
  • awk 命令接受两个变量作为参数并返回一个值

    我有一个有 50 行的文件 每行由三列组成 前两列是变量 这将作为参数传递以返回第三列的值 对于前 command file txt 是文件 它包含 A B 10 C D 20 E F 30 G H 50 I J 70 我有一个包含以下命令
  • Android 共享首选项和数组

    我创建了一个天气小部件 我将其配置存储在SharedPreferences 小部件由服务更新 我将天气信息和天气预报一起保存在一个数组中 晚上手机关机后 我发现数组值消失了 也许系统暂停了 服务 有没有办法将数组存储在SharePrefer
  • 如何使用 NSPredicate 判断 Int 列表是否包含 Int 数字?

    我有一个 Realm 模型Person谁拥有标签属性 let tags List
  • C 编程中的输入重定向?

    我试图将一个名为 data1 的数据文件重定向到我的程序中 但我不断收到segmentation fault 当我尝试时 w data1然后它会正确读取它 但是当我这样做时 w lt data1然后弹出错误 我必须使用第二种方式来完成我的作
  • 将 java.util.Date 转换为 java.sql.Timestamp 结果为错误值

    服务器端代码 服务器时区是 UTC Date aDate new Date java sql Timestamp aTimestamp new java sql Timestamp aDate getTime 客户端 移动应用程序 时区 G
  • IIS 7.5 无法使用代码隐藏文件加载自定义 HTTP 处理程序

    在过去的 2 天里 我试图让我的自定义 HTTP 处理程序正常工作 但没有结果 我收到以下错误 无法加载类型 AlarmHandler 描述 未处理 执行当前 Web 请求期间发生异常 请查看堆栈跟踪以获取有关错误和的更多信息 它起源于代码
  • 如何为 php 启用 mysqlnd?

    我安装并运行了 PHP 版本 5 3 17 我想切换到 mysqlnd 在 phpinfo 中 mysqlnd 根本不存在 我读到为了设置它 您需要更新 configure命令 configure with mysql mysqlnd wi
  • 更改焦点上组合框的边框颜色

    我有一个习惯ComboBox 我想给一个定制BorderColor to the ComboBox 当它聚焦时 为此 我使用以下代码 Graphics g Graphics FromHwnd Handle Rectangle bounds
  • 在 C++ 中,从函数返回向量仍然是不好的做法吗?

    简洁版本 在许多编程语言中 返回大型对象 例如向量 数组 是很常见的 如果类有移动构造函数 这种风格现在在 C 0x 中是否可以接受 或者 C 程序员是否认为它很奇怪 丑陋 令人厌恶 长版 在 C 0x 中 这仍然被认为是不好的形式吗 st