GCC NRVO/RVO 警告

2024-03-26

有没有warning,这让我们知道是否NRVO/RVO执行与否,在GCC?

我找到-fno-elide-constructors关掉NRVO/RVO, but NRVO/RVO有其发生的条件,有时不发生。有必要知道是否NRVO/RVO当额外的复制构造发生时,就会发生理解。

我对编译时功能特别感兴趣。如果有一些具体的就好了#pragma GCC...(它会立即激活诊断)或使用静态断言机制的东西。


我不知道有任何 gcc 特定的诊断消息或其他方法可以轻松解决您的任务。正如您所发现的,-fno-elide-constructors将禁用复制/移动省略,因此您可以确定至少在这种情况下不会发生 (N)RVO。

然而,快速浏览一下第 12.8 节中的第 31 段这个 C++11 工作草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf指出:

当满足某些标准时,允许实施省略 类对象的复制/移动构造,即使复制/移动 对象的构造函数和/或析构函数有副作用。在 此类情况,实现处理源和目标 省略复制/移动操作作为简单的两种不同的引用方式 对同一个对象,并且该对象的销毁发生在 当这两个物体被摧毁的时候 没有优化。这种复制/移动操作的省略, 称为复制省略,在以下情况下允许 (可以组合起来消除多个副本):

  • 在具有类返回类型的函数的 return 语句中,当表达式是非易失性自动对象的名称时(其他 比函数或 catch 子句参数)具有相同的 cv-unqualified type 作为函数返回类型,复制/移动操作可以是 通过直接将自动对象构造到 函数的返回值

...

  • 当尚未绑定到引用的临时类对象时(12.2)将被复制/移动到具有相同的类对象 cv-非限定类型,复制/移动操作可以省略 将临时对象直接构造到目标中 省略复制/移动

...

当复制/移动省略发生时,本地自动对象与临时(返回)对象相同,而临时(返回)对象又与“存储”对象(存储返回值的位置)相同。因此本地自动对象与存储对象相同,这意味着指针比较将等于 true。一个简单的例子来证明这一点:

#include <iostream>
#include <vector>

std::vector<int> testNRVO(int value, size_t size, const std::vector<int> **localVec)
{
   std::vector<int> vec(size, value);

   *localVec = &vec;

   /* Do something here.. */

   return vec;
}

int main()
{
   const std::vector<int> *localVec = nullptr;

   std::vector<int> vec = testNRVO(0, 10, &localVec);

   if (&vec == localVec)
      std::cout << "NRVO was applied" << std::endl;
   else
      std::cout << "NRVO was not applied" << std::endl;
}

启用/禁用-fno-elide-constructors按预期更改打印消息。注意:从最严格的意义上讲,当 (N)RVO 未发生时,指针比较可能取决于未定义的行为,因为本地 auto 对象不存在。

进行指针比较会增加麻烦,但具有编译器独立性的优点。

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

GCC NRVO/RVO 警告 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • Android/Firebase - 解析 GCM 事件中的时间戳时出错 - 空时间戳

    我正在构建一个将接收推送通知的 Android 应用程序 我已经完成了 Firebase Cloud Messaging 设置并且几乎可以正常工作 这样我就可以将以下有效负载发送到有效令牌并接收通知和数据 使用网址https fcm goo
  • 本地安装jupyter后,无法运行jupyter笔记本

    在 Linux 红帽上 我尝试在本地安装jupyter pip install jupyter user 似乎一切都安装正确 但是 我不能小跑Jupyter笔记本 nor local bin jupyter 笔记本 Why 安装 pip i
  • 在 Android 上从浏览器下载文件时遇到问题

    我正在使用我的 Galaxy S5 测试正在开发的网站 我们的应用程序在 AWS S3 上公开文件以使用签名 URL 进行下载 下载在内置浏览器和 Chrome 中失败 但在 Firefox 中可以运行 它也可以在我们测试过的所有其他平台上
  • IVpnManagementAgent的IID在哪里定义

    我正在尝试创建一个对象IVpnManagementAgent但我似乎找不到 IID IID x ABI CWindows CNetworking CVpn CIVpnManagementAgent 它的定义是这样我可以实例化RoGetAct
  • “POCO”定义

    有人可以定义 POCO 到底是什么意思吗 我越来越频繁地遇到这个术语 我想知道它是否仅与普通类有关还是意味着更多 普通的旧 C 对象 只是一个普通的类 没有描述基础结构问题的属性或域对象不应具有的其他职责 编辑 正如其他答案所述 它在技术上
  • 隐式类型与匿名类型

    隐式类型和匿名类型之间是否相同或有什么区别 如果不同 那么隐式类型和匿名类型之间的主要区别是什么 这是个很大的差异 隐式类型 局部 变量是未显式给出类型的变量 var i new StringBuilder Now i是隐式类型String
  • 如果未选择所需的输入,则会发出警告

    如何添加警告 printpage当它被禁用时 如果它选择说请检查必填字段 Set up a blur event handler for each text field form control not BusinessName on bl
  • 如何打乱数组以使所有元素改变其位置

    我需要对数组进行洗牌 以便所有数组元素都应该更改其位置 给定一个数组 0 1 2 3 就可以得到 1 0 3 2 or 3 2 0 1 但不是 3 1 2 0 因为2保持不变 我想算法不会是特定于语言的 但以防万一 我在 C 程序中需要它
  • nltk 无法找到 mace4

    在执行下面的代码时 我收到了如上所述的错误 我从以下位置下载了所需的包http www cs unm edu mccune prover9 download http www cs unm edu mccune prover9 downlo
  • 翻译字符串作为 Laravel 中的键

    我阅读了有关翻译字符串的文档检索翻译字符串 https laravel com docs 5 4 localization retrieving translation strings但不知何故我不明白如何应用它 假设我想在视图中渲染pos
  • 使UIImage符合NSCopying协议

    问题很简单 我需要一个符合 NSCopying 协议的 UIImage 但我完全不知道从哪里开始实现这一点 你有什么指示可以帮助我吗 提前致谢 id copyWithZone NSZone zone return UIImage alloc
  • SQL方法用单个空格替换重复空格

    有没有更优雅的方法来做到这一点 我想用单个空格替换重复的空格 declare i int set i 0 while i lt 20 begin update myTable set myTextColumn replace myTextC
  • 使用路径样式 amazon aws sdk go

    我在我的应用程序中使用一些 aws sdk go 功能 它会创建要请求的 DNS 样式主机 例如somebucket mys3 com 但我有一些 DNS 问题 希望以路径方式接收请求 例如mys3 com somebucket 如何配置
  • 尝试在 Javascript (ES5) 中实现 OPP 继承的简单方法

    只是出于好奇 我在 Javascript 中玩弄原型继承和 OOP 继承 大多数结果涉及用函数模拟 类 和 扩展 概念 而其他结果则使用原型和构造函数 我写了这段代码 function Warrior weaponName var weap
  • Android:“BadTokenException:无法添加窗口;您的活动正在运行吗?”在 PreferenceActivity 中显示对话框

    我想寻求一些帮助 在我的应用程序中 我只有一个活动 一个PreferenceActivity 不需要其他 它只是一个简单的后台同步应用程序 所以PrefsActivity是主 启动器 用户设置首选项后 检查checkBoxPreferenc
  • Java 和 PostgreSQL 之间的“坏记录 MAC”SSL 错误

    我们遇到了 Java 应用程序和 PostgreSQL 8 3 服务器之间随机断开连接的问题 并出现 坏记录 MAC SSL 错误 我们两边都运行 Debian Lenny 在客户端 我们看到 main WRITE TLSv1 Applic
  • 如何获取整个月的天数

    我正在创建全年日历 如何在 Flutter 中获取该月的天数 例如 一月 gt 31 二月 gt 28 29 按年 三月 gt 31 依此类推 Using date1 difference date2 inDays 是不正确的 对于某些日期
  • 从类和 javadoc 生成代码存根

    有人熟悉生成代码存根的工具吗具有有意义的名称来自类和javadoc 真正的问题应该是 我的类没有调试信息和匹配的 javadoc 但我的 IntelliJ IDEA 8 0 1 拜托 没有 IDE 战争 没有考虑 javadoc 并向我显示
  • 可以在单个进程中在 JNI 中创建多个 JVM 吗? [复制]

    这个问题在这里已经有答案了 我有一个在单个进程中运行并允许使用模块的 C 框架 我想添加的一种类型的模块是加载 JAR 然后调用其中特定的预定义函数的模块 根据用户的需要 可以有任意数量的模块同时运行 这就提出了一个问题 每个模块是否可以使
  • GCC NRVO/RVO 警告

    有没有warning 这让我们知道是否NRVO RVO执行与否 在GCC 我找到 fno elide constructors关掉NRVO RVO but NRVO RVO有其发生的条件 有时不发生 有必要知道是否NRVO RVO当额外的复