n = 0和n = n – n之间的差异
发布时间:2020-12-16 06:49:42 所属栏目:百科 来源:网络整理
导读:当我读到 this问题时,我记得有人曾经告诉过我(很多年前),从汇编程序来看,这两个操作是非常不同的: n = 0;n = n - n; 这是真的,如果是的话,为什么会这样呢? 编辑:正如一些回复所指出的,我想这对于编译器优化到同一个东西来说相当容易.但我觉得有趣的是,如
当我读到
this问题时,我记得有人曾经告诉过我(很多年前),从汇编程序来看,这两个操作是非常不同的:
n = 0; n = n - n; 这是真的,如果是的话,为什么会这样呢? 编辑:正如一些回复所指出的,我想这对于编译器优化到同一个东西来说相当容易.但我觉得有趣的是,如果编译器采用完全通用的方法,它们会有所不同. 解决方法
在早期,内存和CPU周期很少.这导致了许多所谓的“窥视孔优化”.我们来看看代码:
move.l #0,d0 moveq.l #0,d0 sub.l a0,a0 第一条指令需要两个字节用于操作码,然后四个字节用于值(0).这意味着浪费了四个字节加上你需要访问内存两次(一次用于操作码,一次用于数据). Sloooow. moveq.l更好,因为它会将数据合并到操作码中,但它只允许将0到7之间的值写入寄存器.并且您仅限于数据寄存器,没有快速清除地址寄存器的方法.您必须清除数据寄存器,然后将数据寄存器装入地址寄存器(两个操作码.坏.). 导致最后一个操作在任何寄存器上的操作,只需要两个字节,一个内存读取.翻译成C,你会得到 n = n - n; 这适用于最常用的n类型(整数或指针). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ajax提交表单页面刷新很快
- c – 用于字符串编码的boost :: locale to_utf函数,喜欢抛出
- 前端每周清单第 32 期:React 开源协议更新、JS 完整编年史
- ActionBarActivity xml设置无标题 出现 java.lang.illegalS
- wpf – 具有聚合模型类的MVVM – 如何在ViewModels中包装?
- ruby-on-rails – 使用Compass in rails可以为开发和生产设
- c# – 使用FastMember将不同的对象列表转换为DataTable
- 如何处理Ruby 2.1.2内存泄漏?
- cocos2d-x删除本地存储文件UserDefault.xml的方法——白白
- ios – 将UI导航栏设置为部分半透明的Swift xCode