GCC 不使用 inc

2023-11-25

海湾合作委员会编译器

$ gcc --version
gcc (GCC) 4.8.2
...

不生成inc汇编指令,它实际上可能有用,例如在这个 C 程序中:

int main(int argc, char **argv)
{
    int sum = 0;
    int i;
    for(i = 0; i < 1000000000L; i++)                     <---- that "i++"
        sum += i;
    return sum;
}

相反,它会生成一个add操作说明:

0000000000000000 <main>:
   0:   31 d2                   xor    %edx,%edx
   2:   31 c0                   xor    %eax,%eax
   4:   0f 1f 40 00             nopl   0x0(%rax)
   8:   01 d0                   add    %edx,%eax
   a:   83 c2 01                add    $0x1,%edx         <---- HERE
   d:   81 fa 00 ca 9a 3b       cmp    $0x3b9aca00,%edx
  13:   75 f3                   jne    8 <main+0x8>
  15:   f3 c3                   repz retq 

为什么要这样做?

EDIT: 我用了gcc -O2来编译这个。gcc -Os确实生成了inc操作说明。没有使用inc更多的是速度优化而不是空间优化?


尝试一下-march=<your machine>。结果可能会有所不同。

但请注意add $1, %reg不一定是一个糟糕的选择。虽然inc and dec具有更小的编码,这很有吸引力,但它们只部分更新标志,导致错误的依赖问题。英特尔优化手册包含以下评论(我的重点):

INC 和DEC 指令仅修改标志寄存器中的部分位。这 创建对标志寄存器的所有先前写入的依赖。这尤其是 当这些指令位于关键路径上时会出现问题,因为它们用于 更改许多其他指令所依赖的负载的地址。 汇编/编译器编码规则 33。(M 影响,H 通用性)增量和减量 指令应替换为 ADD 或 SUB 指令,因为添加和 SUB 覆盖所有标志,而 INC 和 DEC 不会,因此创建 false 依赖于设置标志的早期指令。

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

GCC 不使用 inc 的相关文章

随机推荐

  • ASP.NET MVC - 填充下拉列表

    我是 ASP NET MVC 新手 我试图弄清楚如何根据数据库中的值创建基本下拉列表 在 ASP NET Web 表单中 我知道我可以加载如下下拉列表 页面 aspx
  • 检查数组是否有一个或多个空值[重复]

    这个问题在这里已经有答案了 我有数组 var 如果数组中的一个或多个元素为空 我的意思是 字符串是 我想返回 FALSE 我觉得array filter 是更好的方法 但我不知道如何以这种方式过滤它 我该怎么做 函数emptyElement
  • 仅使用内置库使用 Python 制作基本的网络抓取工具 - Python

    学习Python 我试图制作一个没有任何第三方库的网络爬虫 这样这个过程对我来说就不会被简化 而且我知道我在做什么 我浏览了一些在线资源 但所有这些资源都让我对某些事情感到困惑 html 看起来像这样 lots of other div t
  • 有没有一个公式可以将纬度和经度转换为单个数字?

    你能告诉我是否有一个公式可以将纬度和经度转换为单个数字 我计划将其用于提供交付路由的软件中的数据库表 表行将包含该号码以及邮政地址 数据库表将按数字升序排序 以便软件可以找出卡车需要前往第一个 第二个等的地址 请您回复显示 VB 或 VB
  • 如何指定运行脚本的python版本?

    我现在正在使用预装 python 2 7 5 的 mac 学习 python 但我也安装了最新的3 4 我知道如何选择在命令行模式下使用哪个解释器 即 python vs python 3 将调出各自的解释器 但是 如果我只是编写一个包含此
  • 自定义自动隐藏浮动操作按钮行为不起作用

    我试图在 NestedScrollView 向下滚动时隐藏 FloatingActionButton 并在 NestedScrollView 向上滚动时显示自身 这是我的布局
  • 如何内省 Django 中的属性和模型字段?

    我正在尝试获取给定对象的所有现有模型字段和属性的列表 有没有一种干净的方法来内省对象 以便我可以获得字段和属性的字典 class MyModel Model url models TextField def get location sel
  • 将 JTextField 输入转换为 Integer

    我是 JAVA 新手 我试图将 JTextField 的输入转换为整数 我尝试了很多选项 但没有任何效果 Eclipse 总是给我一个错误 并且这些错误对我来说没有意义 导入java awt Graphics 导入java awt Colo
  • 如何访问 MediaBrowserServiceCompat 服务的实例?

    令人惊讶的是 我正在努力获取源自以下内容的服务实例 MediaBrowserServiceCompat 对于典型的服务 为了实现这一点 使用本地绑定器 class MyService extends MediaBrowserServiceC
  • Angular 5 - 在运行时动态加载模块(在编译时未知)

    Angular 5 是否可以动态加载编译时未知但运行时未知的模块 组件 我想这不会使用 webpack 工作 但也许使用 system js EDIT 整个想法是构建一个基于插件的应用程序 其中各个插件被放入插件文件夹中 Angular 将
  • 为多个按钮实现 onTouchListener() 的单一方法

    我想看看是否有一种方法可以创建一个方法来实现多个按钮的触摸侦听器 因为我有很多按钮几乎可以完成相同的操作 他们所做的唯一区别是他们通过我的 sendMessage 方法发送的消息 以及需要按住按钮多长时间才能发送消息 如果有办法做到这一点
  • JSF 2.0:如何在使用 HttpServletRequest.login 后重定向到受保护页面

    我正在尝试将 HttpServletRequest login 与基于表单的身份验证一起使用 一切都很好 容器告诉登录名 密码是否正确 除了用户输入登录名后 我不知道如何将用户重定向到他要求的受保护页面 重新显示登录表单 怎么做 在此先感谢
  • 生成 svn 中文件的更改历史记录

    是否可以生成一个文件 其中包括对某个文件所做的所有更改的摘要 什么 何时 由谁 VSS 中曾经有这样的选项 我认为它被称为 历史记录 它非常适合回溯并跟踪谁在何时进行了某些更改 顺便说一句 我正在使用 tortoisesvn 先感谢您 右键
  • fpdf 中单元格内的背景颜色没有变化

    我使用 fpdf 为我的报告生成 pdf 文件 对此我还是新手 我想更改单元格内的填充颜色 但每当我重新加载页面时 什么也没有 hapeens 它仍然是相同的白色填充颜色 这是我的代码 我的代码有什么问题吗 我按照设置填充颜色的正确方法进行
  • QQuickWindow透明

    我将 QQmlApplicationEngine 与 QQuickWindow 一起用于应用程序 但我不能 透明的主窗口 我想在应用程序弹出之前设置启动画面 并且我使用 Window 组件 它应该是透明的 但事实并非如此 我的 main c
  • iPhone - 从视频文件中分离音频并将其保存到单独的文件中

    有谁知道是否可以将音频从视频文件 例如 h 264 编码 mpeg 或其他此类格式 中分离出来 然后将该音频数据保存到单独的文件 例如 mp3 文件 中 这涉及到iPhone SDK 任何正确方向的指示将不胜感激 谢谢 听起来像是 AVFo
  • C++ 从 URL 解析主机 IP 地址

    给定 URL 如何解析主机 IP 地址Visual C 我不确定是否有特定的 C 类来执行主机名查找 但您始终可以使用纯 C 来执行此类操作 这是我的版本 可以在 Linux Mac OS X 和 Windows 上编译和运行 includ
  • Android:添加带有展开动画的视图(不闪烁)

    我想使用扩展动画将视图添加到视图组 因此添加的视图一开始非常小 并且占用越来越多的空间 直到达到其完整大小 可能会在此过程中移动其他视图 在尝试了不同的方法之后 我想出了下面的解决方案 如果对您有帮助 请投票 或者请发布更好的替代方案 我确
  • C# 比较两个对象模型中的数据

    我有一个对话框 当生成时 它会填充对象模型中的数据 此时 数据被复制并存储在 备份 对象模型中 当用户完成更改并单击 确定 关闭对话框时 我需要一种快速方法将备份对象模型与实时对象模型进行比较 如果发生任何更改 我可以为用户创建新的撤消状态
  • GCC 不使用 inc

    海湾合作委员会编译器 gcc version gcc GCC 4 8 2 不生成inc汇编指令 它实际上可能有用 例如在这个 C 程序中 int main int argc char argv int sum 0 int i for i 0