Hacker News 中文摘要

RSS订阅

将寄存器与自身异或是清零的惯用方法。为什么不使用减法? -- XOR'ing a register with itself is the idiom for zeroing it out. Why not sub?

文章摘要

文章探讨了在编程中为何常用异或操作(xor)而非减法(sub)来将寄存器清零。虽然两者都能实现相同效果,但异或操作在性能和指令长度上更具优势,成为更优选择。

文章总结

文章标题:为什么用XOR而非SUB指令清零寄存器?

主要内容:

  1. 背景介绍

    • 在x86架构中,xor eax, eax是清零寄存器的惯用方法,因其比mov eax, 0更节省字节。
    • 但同样高效的sub eax, eax却未被广泛采用,尽管两者在编码长度和执行周期上相同。
  2. 性能对比

    • 标志位影响xor会清除OF、SF、ZF、PF、CF,但AF未定义;而sub会清除所有标志位(包括AF)。
    • 硬件优化:现代CPU(如Intel)对xorsub均能识别并优化为“零周期操作”,但其他厂商可能仅优化xor
  3. 历史原因

    • 早期偏好xor可能因“更巧妙”的直觉或编译器早期采用而占据优势。
    • 从众效应:开发者模仿编译器的xor用法,形成正反馈循环,最终巩固其主导地位。
  4. 其他细节

    • 特殊架构:Itanium处理器因有专用零寄存器,无需此类技巧。
    • 个人轶事:作者同事偏好sub,成为其代码风格的标志。
  5. 结论

    • 尽管sub在某些方面更优,但xor因历史惯性成为行业标准,体现了技术选择中微优势的放大效应。

删减内容:

  • 原文中大量导航栏、评论、作者介绍等非技术性内容。
  • 重复的代码对比表格和部分冗余的硬件优化说明。

评论总结

以下是评论内容的总结:

  1. XOR的性能优势

    • 多位评论者认为XOR比SUB更快,因为XOR无需处理进位传播,且每个比特的操作独立。
    • 引用:
      • "In XOR you don't have to propagate the carry bit... output of every bit is independent" (NewCzech)
      • "XOR is a simple logic-gate operation... SUB would have to be an ALU operation" (RiverCrochet)
  2. 历史习惯与代码优化

    • XOR因早期指令集更简洁(如单字节操作码)成为习惯,尽管现代硬件中性能差异可能已消失。
    • 引用:
      • "Back in the stone ages XOR ing was just 1 byte of opcode. Habbits stick" (jhoechtl)
      • "xor was the default zeroing idiom... only did sub reg,reg when I actually want its flags result" (enduku)
  3. 硬件实现差异

    • XOR的电路实现更简单(无需补码转换或进位传播),可能更省电。
    • 引用:
      • "hw implementation of xor is simpler... should consume slightly less energy" (empiricus)
      • "SUB requires 4 steps... XOR you don't need twos complement conversion" (dreamcompiler)
  4. 其他观点

    • 教学取舍:SUB因更直观被用于教学,而XOR需额外解释(b1temy)。
    • 特殊用途:IBM某些处理器中XOR可绕过错误检查(Suzuran)。
    • 数学本质:XOR本质是模2减法,与SUB属同类操作(adrian_b)。

争议点
- 有评论指出现代硬件中XOR未必更快(jhoechtl),但早期优势使其成为惯例("network effects" - zahlman)。
- 部分场景(如Itanium)需替代方案(Sweepi)。

总结:XOR因历史性能优势和硬件简洁性成为清零寄存器的首选,但实际差异可能已淡化,习惯和代码可读性仍是关键因素。