是不是更喜欢预增量而不是后增量?

2024-02-01

过去的情况是,预增量是首选,因为类上重载的后增量需要返回表示增量之前对象状态的临时副本。

看来这不再是一个严重的问题(只要内联到位),因为我的旧 C++ 编译器(GCC 4.4.7)似乎将以下两个函数优化为相同的代码:

class Int {
    //...
public:
    Int (int x = 0);
    Int & operator ++ ();
    Int operator ++ (int) {
        Int x(*this);
        ++*this;
        return x;
    }
};

Int & test_pre (Int &a) {
    ++a;
    return a;
}

Int & test_post (Int &a) {
    a++;
    return a;
}

这两个函数的最终汇编结果是:

    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    pushq   %rbx
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    movq    %rdi, %rbx
    call    _ZN3IntppEv
    movq    %rbx, %rax
    popq    %rbx
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc

If nothing is inlined, however, there seems to still be a benefit to preferring pre-increment to post-increment, since test_post is forced to call out into operator++(int).

Let's assume operator++(int) is inlined as an idiomatic copy constructor, call to the pre-increment, and return of the copy, as illustrated above. If the copy constructor is inlined or the default copy constructor implementation, is that sufficient information for the compiler to optimize post-increment so that test_pre and test_post become identical functions? If not, what other information is required?


是的。对于内置类型来说应该不重要。对于这样的类型,编译器可以easily分析语义并优化它们——如果这不会改变行为。

然而,对于类类型来说,may(如果不does)很重要,因为在这种情况下语义可能会更复杂。

class X { /* code */ };

X x;

++x;
x++; 

最后two调用可能完全不同,并且可能执行不同的操作,就像这些调用一样:

x.decrement(); //may be same as ++x (cheating is legal in C++ world!)
x.increment(); //may be same as x++

所以不要让自己陷入语法糖的陷阱。

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

是不是更喜欢预增量而不是后增量? 的相关文章

  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • 将 Emacs AUCTeX 与 Sumatra PDF 同步

    有了我的这些行init el我能够将 Emacs LaTeX 缓冲区与 Sumatra 同步 setq TeX source correlate mode t setq TeX source correlate method synctex
  • 为什么我会出现 Keras 形状不匹配的情况?

    我正在遵循一个针对初学者的 Keras mnist 示例 我尝试更改标签以适合我自己的数据 该数据有 3 个不同的文本分类 我正在使用 to categorical 来实现这一点 形状对我来说看起来不错 但 fit 会出现错误 train
  • 查找数组中长度为 k 的所有子集

    给定一组 1 2 3 4 5 n 对于 n 个元素 我们需要找到长度为 k 的所有子集 例如 如果 n 4 且 k 2 则output将会 1 2 1 3 1 4 2 3 2 4 3 4 我什至不知道如何开始 我们不必使用内置的库函数 如
  • 你怎么会忘记 Laravel 中缓存的 Eloquent 模型呢?

    关于 Laravel 的理论问题在这里 所以我要做的缓存示例是 Article with comments gt remember 5 gt get 理想情况下 我希望有一个文章更新事件 当该模型的实例 已缓存 的 ID 更新时 我想忘记该
  • 存在哪些 ASP.NET MVC 示例项目? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 混合语言框架

    我有一个用 Objective C 编写的框架 我们称之为 MyKit 我用一些 Swift 类对其进行了扩展 我正在尝试使用以下文档来理解它 https developer apple com library ios documentat
  • OpenGL ES 片段着色器可以更改片段的深度值吗?

    OpenGL ES 2 0 中的片段着色器可以更改像素的 Z 值 深度 吗 在 OpenGL ES 2 0 中这是如何实现的 No gl FragDepth 这是 GLSL 桌面版本的一部分 在 OpenGL ES 中不存在 但是 您可以检
  • NHibernate 将类属性映射到行而不是列

    是否可以映射一个类 其中每个属性存储为表中的行而不是列 该场景是我们将全局选项保存到数据库的情况 我们将选项存储在 选项 类中 每个选项都有一个属性 即 展开菜单 退出时保存 等 我们不想将每个选项存储在其自己的表列中 而是希望有一个表 其
  • 如何获取包含占位符的属性的原始值?

    我试图在我的 properties 文件之一中定义以下属性 personExpression person surname 然后由配置类读取 Configuration public class TemplateConfig Autowir
  • 在 Chrome 扩展程序中获取 JSON

    我的 chrome 扩展有一个小问题 我只是想从另一台服务器获取 JSON 数组 但清单 2 不允许我这样做 我尝试指定content security policy 但 JSON 数组存储在没有 SSL 证书的服务器上 那么 如果不使用清
  • 更改 varchar 列的最大长度?

    我正在尝试将 varchar 列的长度从 255 个字符更新为 500 个字符 而不会丢失内容 我之前已经删除并重新创建过表 但我从未接触过 alter 语句 我相信我需要使用它来执行此操作 我在这里找到了文档 更改表 Transact S
  • Python——使用 Selenium 打开多个选项卡

    我正在使用Python 我正在尝试在 Chrome 上打开两个选项卡 每个选项卡都指向不同的网站 这是我的代码 from selenium import webdriver from selenium webdriver common ke
  • 将视频添加到 YouTube 上用户最喜欢/喜欢的播放列表

    目的是使用 YouTube API 创建一个收藏 喜欢按钮 当用户单击该按钮时 视频将保存到用户的 收藏 喜欢 播放列表中 就像您在自己的网站上实施 Facebook Like 按钮时的工作原理一样 这本质上是对发布的出色解决方案的后续问题
  • 在 google oauth 后,如何在不使用 webview 的情况下将用户重定向回我的应用程序?

    谷歌决定禁止通过 webview 进行 oauth 给我带来了巨大的麻烦 迁移到替代方案是一个漫长而困难的过程 我目前正在使用建议的 AppAuth 库 并且我收到用户抱怨 如果不将帐户添加到 chrome 他们的设备 这作为据我所知 如果
  • 地址簿联系人排序

    我有下面的代码 我设法从地址簿中列出了姓名和电话号码 但如何按名字对其进行排序 ABAddressBookRef addressBookRef ABAddressBookCreateWithOptions NULL NULL abConta
  • 多线程 Grep

    我有以下包含 30233088 字符串的 大 文件 head mystringfile txt GAATGAACACGAAGAA GAATGAACACGAAGAC GAATGAACACGAAGAG GAATGAACACGAAGCA cat
  • 为什么厨师无法解析我的食谱?

    Intro我正在学习 Chef 以自动化工作中的服务器管理 我从下载了 Chefdk 3 0here https downloads getchef com chef dk windows 现在我正在尝试使用厨师制作我的第一本食谱 重要的我
  • .npm 缓存与 node_modules 大小

    在构建节点应用程序时 我们使用 npm 缓存 如下所示 npm install cache tmp node cache npm prefer offline 但是我有理由相信 缓存无法正常工作 因为 tmp node cache du s
  • 在 AWS Elastic Beanstalk 上部署 Flask 与运行脚本有何不同?

    在 ec2 实例上部署 Flask 应用程序 换句话说 在任何计算机上运行脚本 和通过 AWS Elastic Beanstalk 部署 Flask 应用程序有什么区别 烧瓶部署文档 http flask pocoo org docs 0
  • 是不是更喜欢预增量而不是后增量?

    过去的情况是 预增量是首选 因为类上重载的后增量需要返回表示增量之前对象状态的临时副本 看来这不再是一个严重的问题 只要内联到位 因为我的旧 C 编译器 GCC 4 4 7 似乎将以下两个函数优化为相同的代码 class Int publi