如何有效地将左值或右值绑定到同一引用?

2024-04-03

假设您有一个 C++ 函数,它使用 (const) 参数的更改版本。

MyObject alter_obj( MyObject const & obj ); // Creates new, altered object

void func( MyObject const & original ) {
    MyObject const & altered( alter_obj( original ) );
    // ...
}

由于“最重要的常量”而导致临时的生命周期延长,因此这种方法可以正常工作。如果alter_obj()满足返回值优化的要求,因为 RVO 意味着不会不必要地复制按值返回的更改对象。

如果您根本不进行更改,它也会很有效:

void func( MyObject const & original ) {
    MyObject const & not_altered( original );
    // ...
}

对给定对象的附加引用基本上是免费的,没有任何复制的性能开销。

但是假设需求发生了一些变化,并且您希望根据运行时条件选择是否进行更改。天真地,我希望使用三元运算符来组合前面的两种方法会很有效,在可能的情况下直接绑定原始对象,如果没有则绑定临时对象。

MyObject alter_obj( MyObject const & obj ); // Creates new, altered object

void func( MyObject const & original ) {
    // ...
    MyObject const & possibly_altered( 
        apply_alteration ? 
        alter_obj( original ) : 
        original 
    );
    // ...
}

然而,这种方法似乎并不像我希望的那样有效。三元运算符显然需要最后两个参数左值/右值状态匹配 https://stackoverflow.com/a/30088030/3022952,而不仅仅是名义类型。这意味着当采用 false(无更改)分支时,通过调用 MyObject 的复制构造函数来创建临时右值original。如果 MyObject 的复制难度很大,则由于制作此“虚假”副本,可能会造成性能损失。

有没有好的办法解决这个问题?是否可以有效地将本地引用绑定到另一个现有引用或临时引用(基于运行时值的选择),而无需制作额外的副本?


我会创建单独的函数,它接受引用并调用它,如下所示:

void func( MyObject const & original ) {
    if (apply_alteration)
        func_internal(alter_obj(original));
    else
        func_internal(original);
}

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

如何有效地将左值或右值绑定到同一引用? 的相关文章

  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando

随机推荐

  • 未找到 GraphViz 的可执行文件:Anaconda-3

    我正在尝试显示树输出 但是当我运行下面的脚本时 我收到如下错误 IncationException 未找到 GraphViz 的可执行文件 我在这里搜索过类似的主题 但其中大多数与 Mac 相关 我使用的是 Windows 10 64 位操
  • 类常量

    我有几个 obj c 类 每个类都需要一些在 switch 语句中使用的常量 我曾尝试使用以下命令在 m 文件中定义这些数字常量 define预处理器指令 所有这些常量都以 kCell 开头 这似乎工作得很好 但 Xcode 的代码感知向我
  • 是否可以设置 git merge 来自动解析? (git 雷雷雷)

    我有 2 台笔记本电脑 其中有一个纯文本文件 该文件必须同步 它用作第三方软件的数据库 客户希望每天同步该文件的内容 第一个想法是制作一个将文件上传到 Dropbox 的脚本 但如果发生冲突 两个用户删除 A 行 第一个用户添加 B 行 第
  • 如何使用slf4j和java.util.logging登录tomcat

    我创建了一个在 Tomcat 8 上运行的 Web 应用程序 一如既往 我想使用 slf4j 在本例中 由 java util logging 支持 因为它是 Tomcat 的默认设置 相关依赖是这样的
  • 返回对 C++ 中静态局部变量的引用

    这个问题只是为了我更好地理解C 中的静态变量 我认为如果将 C 中的局部变量声明为静态 我可以返回对它的引用 因为该变量应该在函数返回后继续存在 为什么这不起作用 include
  • 如何解决Admob执行异常?

    我一直在尝试在我的全新应用程序中实施 Google Admob 广告 我已经处理错误代码 0 内部错误 和 广告 错误等待未来 异常几个小时了 从今天早上起 我就有了一个带有付款方式的 Admob 帐户 我一直在使用我的凭据关注 Googl
  • Tectonicus 2.25 的 XML 文件错误

    我正在尝试为我的单人游戏世界制作一张 Tectonicus 地图 因此我需要一个 XML 配置文件 但是当尝试制作地图时 我在终端 MAC OSX 中收到此错误 Parsing config from Users ralphvandenhe
  • 我无法找到 libftdi 的 mpsse (SPI) 模式的示例代码

    这不是一个家庭作业问题 尽管这是一个工作问题 几个月前 我刚写完一份规范 老板就会把它外包出去 因为资金紧张 所以我正在尝试自己做这件事 我是一个很弱的 C 编码员 如果 gcc 能输出一些运行时不会出现段错误的东西 或者有时根本没有任何东
  • 从 Spring MVC @RestController 返回视图

    As RestController是组成 Controller and ResponseBody 我相信如果我希望我的控制器同时工作 MVC 和 REST 控制器只需注释 RestController应该没事 那是对的吗 As RestCo
  • 从 App Store 中删除应用程序

    我按照以下步骤从 App Store 中删除了我的应用程序 但我没有看到任何 删除 选项 http msdn microsoft com en us library windows apps jj193601 aspx http msdn
  • 尝试创建一个脚本,如果提交者回答错误,该脚本会在表单提交时向提交者发送电子邮件

    我正在查看表单提交 如果提交者填写了任何错误的问题 则向提交者发送电子邮件 但脚本也会向所有输入正确的提交者发送电子邮件 我知道 if 脚本可以处理数字 就像我在另一个项目中使用它一样 但是当我将问题更改为 true false 时 它 似
  • 我应该使用哪个命名空间和程序集来声明共享项目中的转换器

    我应该使用哪个命名空间和程序集在 Xamarin 中的共享项目中声明转换器 对于该资源
  • 如何使用 Struts 预防 XSS 漏洞

    我们需要在 Struts 应用程序中添加反 XSS 支持 最具体地说 架构师要求所有用户输入在存储到数据库之前必须进行 清理 由于我不想重新发明方轮 我可以使用哪个 Java 库来实现此目的 以及把它放在哪里 理想情况下 它应该是可配置的
  • 在 docker 容器中使用 uwsgi 和 nginx 设置 Flask 应用程序

    我正在尝试在 Docker 容器中运行带有 Flask uwsgi 和 nginx 的 Docker 容器 我的 Dockerfile 看起来是这样的 FROM ubuntu 16 04 MAINTAINER Dockerfiles Ins
  • 如何更新推送通知的配置文件 - IOS

    我们正在开发一个IOS应用程序 我们想要实现推送通知 我已经浏览了苹果文档 并要求我的团队代理在iOS开发中心启用推送通知 他们似乎做到了 现在已经启用了 我已经在我的应用程序中注册了推送通知 如下所示 UIApplication shar
  • 寻找有关在 Windows 7 上安装应用程序的“正确”方法的文档

    我正在使用一些遗留应用程序 10 15 年 并试图找到有关在 Windows 7 上安装和运行它们 以及任何用户应用程序 的 正确 方法的指导 而无需完全的管理员权限 换句话说 可执行文件 只读文件应存放在何处 用户数据 读写文件应存放在何
  • Linux Entity Framework Core 上的 SQL Server 连接字符串无效

    我使用的是Linux 更具体地说是Xubuntu 我已在我的计算机上安装了 SQL Server Express 我目前正在制作一个网络应用程序 但我的连接似乎无法正常工作 或者我不太理解所有内容 我得到的输出是 A network rel
  • 在 Java 中使用一组固定字母将 long 编码/解码为字符串

    给定一组任意字母 String range 0123456789abcdefghijklmnopABCD 我正在寻找两种从长 字符串进行编码 解码的方法 String s encode range l and long l decode r
  • 在 Python 中读取和解释二进制文件中的数据

    我想逐字节读取文件并检查每个字节的最后一位是否已设置 usr bin python def main fh open tmp test txt rb try byte fh read 1 while byte if int byte 16
  • 如何有效地将左值或右值绑定到同一引用?

    假设您有一个 C 函数 它使用 const 参数的更改版本 MyObject alter obj MyObject const obj Creates new altered object void func MyObject const