C++11 中返回本地值的最佳方式

2023-12-24

在过去,如果我想要一个对象的字符串表示A,我会写一些带有签名的东西void to_string(const A& a, string& out)以避免额外的副本。这是否仍然是 C++11 中的最佳实践(包括移动语义等)?

我读过一些关于其他上下文的评论,建议依赖 RVO 而不是写string to_string(const A& a)。但 RVO 并不能保证一定会发生!那么,作为 to_string 的程序员,我如何保证字符串不会被不必要地复制(独立于编译器)?


假设您的函数中的代码采用以下形式:

std::string data = ...;
//do some processing.
return data;

然后需要调用这个std::string如果省略不可用,则移动构造函数。所以最坏的情况是,你得从你的内部弦上移开。

如果您无法承担移动操作的成本,那么您必须将其作为参考。

话虽如此......您是否担心编译器无法内联短函数?您是否担心小型包装器是否无法得到适当的优化?是否有编译器没有优化的可能性for循环之类的东西让你烦恼吗?你有没有想过是否if(x < y)if(x - y < 0)?

如果不是......那么你为什么关心复制/移动省略(“返回值优化”的技术术语,因为它用在比这更多的地方)?如果您使用的编译器不支持复制省略,那么您使用的编译器很糟糕,可能无法支持大量其他优化。出于性能考虑,您最好花时间升级编译器,而不是将返回值转换为引用。

防止实际发生的不可能的副本情况不值得......麻烦?可读性较差的代码?到底是什么?简单回报的额外因素是什么?

“额外的事情”是这样的:

std::string aString = to_string(a);

比这个更具可读性:

std::string aString;
to_string(a, aString);

在第一种情况下,它是立即地显然to_string正在初始化一个字符串。在第二个例子中,事实并非如此;你必须抬头看to_string的签名以查看它正在采取non-const参考。

第一种情况甚至不是“惯用的”;一般人都会这样写。你永远不会看到to_int(a, someInt)要求整数;这是荒谬的。为什么整数创建和对象创建如此不同?你不应该必须关心作为程序员,是否为返回值或其他原因发生了太多副本。你只需以简单、明显且易于理解的方式做事即可。

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

C++11 中返回本地值的最佳方式 的相关文章

  • 如何将一个div的内容克隆到另一个div

    我想使用jquery克隆将选定div的内容复制到另一个div 但我不想将它附加到任何地方 我的意思是 当我们用 jquery 克隆一个 div 时 如果我错了 请纠正我 我们必须设置它的位置 它将动态创建一个显示的新分区 但我想获取所选di
  • 返回右值 - 这段代码有什么问题? [复制]

    这个问题在这里已经有答案了 我遇到了以下代码片段 std string test std string m Hello return std move m int main std string m test 我知道上面的代码是不正确且不安
  • C++ 中的垃圾收集——为什么?

    我不断听到人们抱怨 C 没有垃圾回收功能 我还听说 C 标准委员会正在考虑将其添加到该语言中 恐怕我只是不明白它的意义 使用 RAII 和智能指针消除了它的需要 对吗 我唯一的垃圾收集经验是在几台廉价的八十年代家用计算机上 这意味着系统会时
  • C++11 中引入了哪些重大更改?

    我知道 C 11 中至少有一项更改会导致一些旧代码停止编译 引入explicit operator bool 在标准库中 替换旧实例operator void 诚然 这将破坏的代码可能是一开始就不应该有效的代码 但它仍然是一个破坏性的变化
  • 如何将可变参数传递给 std::thread?

    我想通过包装 C 11 中的 std thread 类来使用我自己的 Thread 实现 这样我就能够像我想要的那样处理异常 这是我的包装类 include
  • std::forward 的第二次重载(cppreference.com 上的示例)

    我知道第二次过载std forward template lt class T gt constexpr T forward std remove reference t
  • 关于 C++ 中的 STL 容器的问题

    std multimap 和 std unordered multimap 多久洗一次条目 我这么问是因为我的代码传递引用来区分具有相同哈希的条目 并且我想知道何时对它们运行引用重定向功能 如果我这样做会发生什么 std multimap
  • 派生 Enum 的特征副本时,“未实现特征克隆”

    下面的代码 derive Copy enum MyEnum Test 给我这个错误 错误 特质core clone Clone未针对该类型实现MyEnum E0277 为什么会出现这种情况 我该如何解决 The Copy特质是Clone h
  • 如何从 NSTableView 复制行

    我有一个 NSTableView 它只显示一行数字 我只想使用 cmd copy 或右键单击复制来复制这些数字 如何在 NSTableViews 中实现此功能 这就是我让它工作的方式 并且它的行为与响应者链的预期一致 仅当 NSTableV
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 为什么 std::atomic 对象不可复制?

    看起来std atomic类型不可复制构造或复制分配 为什么 是否有技术原因导致无法复制原子类型 或者是故意限制接口以避免某种不良代码 在没有原子指令 或没有所有整数大小的原子指令 的平台上 类型可能需要包含互斥体以提供原子性 互斥锁通常不
  • 具有更高含义的简单类型 (C++11)

    我经常遇到这样的情况 在我的 C C 11 代码中 我的类型基本上表现得像内置类型 或 基本简单 类型 例如std string 但这有一个意义 超出 32 位数字或一堆字符 我在互联网上没有找到任何有用的东西 因为我真的不知道要搜索什么术
  • 在模式匹配期间防止移动语义

    我这里有一个愚蠢的例子 只是为了演示我在另一个库和模式匹配中遇到的问题 struct Person name String age i32 choice Choices derive Debug enum Choices Good Neut
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 如何创建 C++ 11 不可默认构造的分配器?

    这个主题出现在关于 Visual Studio 2015 的 std list sort 更改的线程中 std list sort 为什么突然切换到自上而下的策略 https stackoverflow com questions 4062
  • 新关键字“auto”;什么时候应该使用它来声明变量类型? [复制]

    这个问题在这里已经有答案了 可能的重复 C 0x auto 关键字多少算太多 https stackoverflow com questions 6434971 how much is too much with c0x auto keyw
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • 无法移出借用内容/无法移出共享引用后面

    我不明白这个错误cannot move out of borrowed content 我收到过很多次了 每次都解决了 但一直不明白为什么 例如 for line in self xslg file iter self buffer cle
  • C++11:数组的编译时计算

    假设我有一些 constexpr 函数 f constexpr int f int x 我在编译时知道一些 const int N Either define N or const int N 根据您的回答的需要 我想要一个 int 数组

随机推荐

  • 在java中执行linux命令并将输出显示到html表

    我有jsp代码df h用于在网站上显示磁盘信息 如何使用表格将输出显示为 html 代码如下 String disk String line String process Process p BufferedReader input p R
  • 如何在 C# 中从单个完整路径创建多个目录?

    如果您有如下完整路径 C dir0 dir1 dir2 dir3 dir4 您将如何最好地实现它以便所有目录都存在 BCL中有这个方法吗 如果没有 最优雅的方法是什么 我会打电话Directory CreateDirectory C dir
  • 在Spring security中使用mysql数据库对用户进行身份验证?

    我想使用 Spring security 对我的 Web 应用程序中的用户进行身份验证 由于我不是 Spring 框架的成熟用户 我无法清楚地了解如何进行配置设置以使用 jdbc user service 我已经完成了以下配置 但它不起作用
  • 如何让 NHibernate 忽略 POCO 中的属性

    我们有 POCO 类似 public class Person public Guid PersonID get set public string FirstName get set public string LastName get
  • 使用 Powershell 脚本进行静默安装

    我正在尝试使用 PowerShell 无提示脚本安装一个客户端软件 下面是我创建的脚本 它不起作用并抛出如下错误 无法验证参数 ArgumentList 上的参数 参数为 null 空或参数集合的元素包含 null 值 提供一个不包含任何空
  • JavaScript DOM 对象到 jQuery 对象

    如何将 JavaScript DOM 对象转换为 jQuery 对象 tr function changeStatus myObject XXX removeClass XXX应该写什么 我知道我可以使用 id 和 id 选择器来解决问题
  • 缺少 Style.Triggers 和 x:Type。为什么?

  • 向服务器发送视频和音频流

    我正在尝试开发一个系统 其中有两个客户端可以通过服务器从浏览器相互视频聊天 第一个客户端将其视频流发送到服务器 服务器将其发送到第二个客户端 此外 服务器将客户端的流保存为视频文件 我使用了这个 WebRTC 示例 https github
  • 平台工具集 v140 和 v140_xp 之间有什么区别?

    以结尾的平台工具集之间有什么区别 xp以及那些没有的 例如 v140 vs v140 xp 为什么没有以以下结尾的工具集 vista or 7 当我在 Windows 7 上编译程序时v140工具集 它可以在 Windows XP Vist
  • 禁用 nginx 日志

    如何禁用 nginx 日志记录而不出现严重错误 error log off 不起作用 只是创建文件名 off 真的 不是开玩笑 error log dev null 不支持 操作系统 freebsd 我需要禁用子域的日志记录 http wi
  • 计算数组的位/字节大小

    我有一个 Javascript 数组 其中有很多子数组 计算数组拥有多少位 字节的最佳 最简单方法是什么 我要将数组发送到我的 PHP 服务器 它只能有 5kB 大 有没有本地方法 我对位不太熟悉 如果我理解正确的话 1 个字符适合 8b
  • Python:并行执行cat子进程

    我正在运行几个cat zgrep远程服务器上的命令并单独收集其输出以进行进一步处理 class MainProcessor mp Process def init self peaks array super MainProcessor s
  • 如何查找 Qt SDK 中使用的当前 QtWebKit 版本?

    我想知道 Qt SDK 中使用的 QtWebKit 模块的版本 谁能帮我吗 1 QTWEBKIT VERSION STR 宏给出 QtWebKit 版本 2 qWebKitVersion 给出使用的 webkit 版本
  • 如何将写入流 1 的内容通过管道传送到流 2 中?

    这是我的场景 producer WriteStream stream consumer ReadStream stream 我想要的东西允许由生成的字节producer将逐步转移至consumer 我可以将所有内容写入MemoryStrea
  • 如何将 Hashmap> 膨胀到 Recyclerview 中

    我希望键字符串必须充当标题 并且列表必须在该映射键下膨胀RecyclerView 谢谢你的帮助 public class Adapter extends RecyclerView Adapter
  • MultiFieldQueryParser 中的提升因子

    我可以使用不同的因素来提升 MultiFieldQueryParser 中的不同字段吗 另外 我可以分配给字段的最大提升因子值是多少 万分感谢 埃德 MultiFieldQueryParser有一个接受增强图的 构造函数 1 你可以像这样使
  • WUA API 无法卸载更新

    我在使用 Windows Update Agent WUA API 时遇到问题 每当我尝试使用卸载更新时IUpdateInstaller IsForced True IUpdateInstaller BeginUninstall 我越来越W
  • Angular 2 Jasmine 测试,加载 app.component.ts 中的所有组件?

    我正在开发一个小型测试应用程序 以更好地学习 Angular 2 和 Angular 2 中的单元测试 来自react Jest 背景 将所有组件都包含在 app component ts 中感觉很奇怪 这就是我到目前为止所拥有的组件层次结
  • 如何通过javascript/html5播放wav音频字节数组?

    我正在使用以下方法来播放包含 wav 数据的字节数组 该函数是从 GWT 项目调用的 这个函数会播放声音 但听起来像是某种地狱怪物 采样率绝对是正确的 声音是由 neospeech 生成的 并且我已经尝试了 numberOfSamples
  • C++11 中返回本地值的最佳方式

    在过去 如果我想要一个对象的字符串表示A 我会写一些带有签名的东西void to string const A a string out 以避免额外的副本 这是否仍然是 C 11 中的最佳实践 包括移动语义等 我读过一些关于其他上下文的评论