panzerQ
光坂国中生
光坂国中生
  • 注册日期2026-03-15
  • 最后登录2026-04-19
  • 生日2004-1-1
  • 光玉10颗
阅读:151回复:1

[转载]高级语言编程,不宜用异或交换两个int型变量的值

楼主#
更多 发布于:2026-03-20 21:23
这么做确实能达到目的:
Input(int a, int b)
a := a ^ b   // 第一步:a 保存 a^b
b := a ^ b   // 第二步:b = (a^b)^b = a
a := a ^ b   // 第三步:a = (a^b)^a = b

但根据早些时候老资历的测评,在桌面平台上,
这种写法往往不会带来时空开销的减小:
用异或来交换两个变量是错误的_用异或来交换两个变量会更快吗-CSDN博客

也可以看下面这个转载:
【转】用异或来交换两个变量是错误的 - Kimi_Lee - 博客园

偏好CISC的Intel还弄出了XCHG系汇编指令(真实存在于IA-32指令集),
专门处理 寄存器-寄存器 值交换的需求,感兴趣者可自行查询相关资料。
喜欢0 评分0
panzerQ
光坂国中生
光坂国中生
  • 注册日期2026-03-15
  • 最后登录2026-04-19
  • 生日2004-1-1
  • 光玉10颗
沙发#
发布于:2026-03-23 09:38
昨天看见B站还有人就这个话题展开讨论,
今天顺便搬运一些有价值的输出:

现代编译器用图着色算法做寄存器分配:
变量是节点 同时活跃的变量之间连边
每种”颜色”对应一个物理寄存器.
先做活跃变量分析构建干扰图
再用贪心算法着色(gcc/ira-color.c的assign_hard_reg函数).
不存在”检索闲置寄存器”
只有”计算冲突最小的分配”
手写xor只会破坏编译器已经计算好的最优解
mov指令在Haswell之后的CPU通过物理寄存器重命名实现零延迟  
mov rax, rbx 不需要真的复制数据
只是让rax和rbx指向同一个物理寄存器.
吞吐量可以达到每周期4条mov(4-wide rename)
而xor必须占用ALU端口 吞吐量最多每周期1条.
这是微架构的根本差异
你去看glibc的memcpy实现 ffmpeg的像素操作
全是movdqu/vmovdqu这类mov指令 为什么?
因为他们做了性能分析 实测数据不会骗人

70年代PDP-11上确实xor有用
因为那时候寄存器只有8个而且宝贵.
但现在x86-64有16个通用寄存器
编译器做活跃变量分析和图着色分配
你手写xor只会帮倒忙

最后说一句
如果你的代码需要维护两个版本才能让人看懂
那问题不在工具 在写代码的方式.
好的代码应该是自解释 让人一看就明白在做什么
这是最基本的工程素养

===================================
可见于下方稿件的一楼:
https://www.bilibili.com/video/BV1zD6cBBEDy
回复(0) 喜欢(0)     评分
游客

返回顶部