加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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类型(整数或指针).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读