|
阅读:151回复:1
[转载]高级语言编程,不宜用异或交换两个int型变量的值
这么做确实能达到目的:
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指令集), 专门处理 寄存器-寄存器 值交换的需求,感兴趣者可自行查询相关资料。 |
|
|
沙发#
发布于: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 |
|