对运算符+和/或运算符+=使用移动语义是否有意义?

2023-11-27

我想知道在重载运算符+和/或运算符+=时,在什么情况下使用移动语义才有意义。尽管它被解释为这个问题我怎么能做到这一点,我无法理解为什么我要这样做。让我们考虑运算符+=。如果我只是通过引用传递右侧对象并对左侧对象进行适当的更改,则无论如何都不会产生不必要的副本。所以我们回到同一点:在这种情况下移动语义会有好处吗?


是和不是。

运算符+=

移动语义不一定有帮助operator+=一般来说,因为您已经在修改左侧参数(this),所以大多数情况下您已经拥有可以使用的资源。

不过,作为一种优化,这可能是值得的。想象一个std::string其默认构造函数不分配任何内存的实现。然后std::string::operator+=(std::string&&)可以简单地从 RHS 窃取资源。或者想象一下,右侧缓冲区足够大,可以容纳所有内容,但左侧缓冲区则不然,那么如果您可以使用右侧缓冲区,那么您就很幸运:只需交换并添加即可。

所以,这可能是值得的,但你必须学习它。所以:

  • T& T::operator+=(T const&): 始终存在
  • T& T::operator+=(T&&):在有意义时启用移动语义

运算符+

在这里它总是有用的(假设我们正在讨论移动语义对其有用的类)。

事情是,operator+产生一个临时的(突然的)所以它通常必须创造资源为了这个临时的。然而,如果它能够窃取而不是创造它们,那肯定会更便宜。

但是,您不需要提供所有重载:

  • T operator+(T const&, T const&)
  • T operator+(T&&, T const&)
  • T operator+(T const&, T&&)
  • T operator+(T&&, T&&)(需要消除歧义)

不,你可以重复使用相同的技巧operator=使用并创建函数签名中的临时权限(通过复制获取一个参数)。如果类型是可移动的,则将调用移动构造函数,否则它将是复制构造函数,但由于无论如何您都需要临时构造函数,因此不会损失性能。

inline T operator+(T left, T const& right) { left += right; return left; }
inline T operator+(T const& left, T right) { right += left; return right; } // commutative
inline T operator+(T left, T&& right) { left += right; return left; } // disambiguation

虽然收获不大(从 4 变成 3),但好吧,我会尽力而为!

当然,对于字符串来说,operator+不可交换(这就是为什么它是一个糟糕的重载),因此第二个重载的实际实现将需要prepend method.

EDIT: 下列的移动语义和运算符重载看来我有点过于热情了。借鉴 Ben Voigt 的答案,我们得到:

inline T operator+(T left, T const& right) { left += right; return left; }
inline T operator+(const T& left, T&& right) { right += left; return right; }

另一方面,这似乎只适用于交换运算;-不是这样工作的,但可能可以调整,/ and %另一方面...

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

对运算符+和/或运算符+=使用移动语义是否有意义? 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • != 在 jade/pug 中起什么作用?

    在下面的翡翠代码中如何工作 messages extends layout block content spacer container row col lg 8 col lg offset 2 col md 10 col md offse
  • 将自定义 NSURLProtocol 与 UIWebView 和 POST 请求结合使用

    在我的 iOS 应用程序中 我使用 UIWebView 和自定义协议 带有我自己的 NSURLProtocol 实现 我非常小心地确保每当我加载 url 时 我都会将类似的内容加载到我的 UIWebView 中 myprotocol mys
  • 在共享库中使用全局变量

    我正在用 C 编写一个应用程序 它使用全局变量 日志文件结构 在我的应用程序中 我在运行时动态加载共享库 并且我想使用指向相同日志文件结构的全局变量来记录共享库 这在简单的方法中似乎是不可能的 将全局变量声明为 extern 将不起作用 因
  • 无法编译、无法执行dex、无法合并、非巨型指令

    我需要一些帮助 因为我自己无法找到解决方案 我阅读了很多帖子并进行了很多调查 但没有解决方案 我有一个项目 有一些子项目 操作栏 滑动 facebook 等 当我尝试编译它时 我总是收到以下错误 2013 07 31 14 44 06 De
  • 如何使用 LINQ 将字典的键和值合并到一个列表中?

    我有一本字典 其中键是一个字符串 值是与该键对应的字符串列表 我想显示字典中的所有键 并在该键下方显示与该键关联的值 像这样的东西 Key 1 Value 1 Value 2 Value 3 Key 2 Value 1 Value 2 在
  • Git 与 SVN 与非文本文件/大型项目

    过去几周我一直在学习 Git 与 SVN 相比 我真的很喜欢它的工作方式 我希望完全切换到它的主要原因是 合并应该更容易 几乎没有冲突 而且我可以在本地提交 这促进了许多分支的使用 例如每个票证 问题 任务 等的一个分支 并且还促进了许多提
  • 调整未知数量的元素大小以填充父容器的宽度

    我需要将未知数量的 div 可能限制为 5 左右 放入父容器中 并始终确保它们保持均等划分 我不确定这是否可以单独使用 CSS 来完成 但我想我最好问一下 因此 如果我们知道使用了 3 个 div div div class menu bu
  • cassandra 分片和复制

    我是 Cassandra 的新手 不过本文解释分片和复制 我陷入了一个困境 我的本地计算机上配置了一个包含 6 个 Cassandra 节点的集群 我创建一个新的键空间 TestKeySpace 复制因子为 6 并在键空间 employee
  • 位置管理器是在调度队列上创建的

    这个消息是什么意思 注意 位置管理器 0xe86bdf0 是在主线程以外的线程上执行的调度队列上创建的 开发人员有责任确保在分配位置管理器对象的线程上运行运行循环 特别是 不支持在任意调度队列 未附加到主队列 中创建位置管理器 这将导致无法
  • 从用户选择的文本返回 HTML

    我有以下非常简单的 html 页面 This is span style background color black color white the span
  • Spark:将大 MySQL 表读入 DataFrame 失败

    我想提前告诉您 以下几个相关问题不能解决我的问题 Spark查询运行速度非常慢 将 mysql 表转换为数据集非常慢 Spark 不会加载大型 MySql 表 Spark MySQL 从数据库读取时出错 This one很接近 但堆栈跟踪不
  • 为什么 jQuery 的电子邮件验证正则表达式如此简单?

    We all know that a regex to validate emails properly would be quite complicated However jQuery s validation plugin has a
  • 使用 git post-receive 挂钩的边带解复用器中出现错误

    我已经使用 git 设置了一个 EC2 实例 并使用 post receive hook 将其部署到我的服务器本教程 这是我的控制台的输出 git push production master email protected s passw
  • 为什么我可以使用 Javascript 阻止 keydown 上的默认事件,但不能阻止 keyup 上的默认事件?

    使用时 keydown我可以捕获 keydown 事件 然后检查并防止默认操作 显示字符 使用时 keyup我不能 我知道该事件被捕获为alert 当代码处于条件内但仍触发时触发preventDefault 不会阻止该操作 这里有一个完整的
  • 按时间和 pandas 中的其他列分组

    我有一个大的 pandas 数据框 其中包含时间戳 名称和值列 index timestamp name value 0 1999 12 31 23 59 59 000107 A 16 1 1999 12 31 23 59 59 00038
  • 胶水爬虫排除模式

    我有一个 s3 存储桶 我正在尝试对其进行爬网和编目 格式是这样的 其中 SQL 文件是 DDL 查询 CREATE TABLE语句 匹配不同数据文件的模式 即data1 data2 etc s3 my bucket somedata 20
  • 将 Html 表导出到 Excel 并保留 css 样式

    我正在使用 Excel Web 查询将 html 表 MVC 视图 导出到 Excel 我如何让它携带CSS样式 如果我设置class redLabel 它不会解释这一点并使标签变为红色 我必须在表格中使用内联样式才能正常工作 有任何想法吗
  • swift 在 iPhone 上截图只有白色背景

    一些背景 我只是想在 swift 中使用 xcode 6 beta 7 做一个简单的程序 以便在按下按钮后对 iPhone 进行屏幕截图 它是在 SpiteKit 和游戏场景中完成的 背景是随机 png 图像和 hello world 默认
  • 使用“cpan”安装 Perl 模块时如何避免 sudo?

    我已将 Perl 从源代码安装到 usr local 中 并相应地调整了我的路径 如下布莱恩 福伊的建议在这里 我确信我遗漏了一些东西 但是 现在我尝试使用 cpan 命令安装东西 但它失败了 因为它无法写入 usr local 我必须使用
  • 对运算符+和/或运算符+=使用移动语义是否有意义?

    我想知道在重载运算符 和 或运算符 时 在什么情况下使用移动语义才有意义 尽管它被解释为这个问题我怎么能做到这一点 我无法理解为什么我要这样做 让我们考虑运算符 如果我只是通过引用传递右侧对象并对左侧对象进行适当的更改 则无论如何都不会产生