GCC 怎么把 switch 变跳表:一张函数指针表的诞生
来源:xoranth.net — 2024-01-14
📋 概述
这篇长文拆解 GCC 在 -O3 下实现 switch 的多种策略。最简单的稠密 case 会被编译成一张函数指针表加一次间接跳转,稀疏 case 则退回决策树;更特殊的情形还会用到位图(bitset)lowering。作者逐段贴出生成的汇编并解释每一步为什么这么选,顺带指出除位图方案外,这些优化在 clang 上也基本成立。
🔑 核心要点
- 连续 case 直接生成 `jmp [表 + rax*8]` 的间接跳转,一次寻址完成分发。
- case 稀疏到表会太大时,编译器退回二分决策树,用比较换空间。
- 位图 lowering 是 GCC 特有的一条路径,clang 上没有对应实现。
- 文章的价值在于把“编译器替你做了选择”这件事摊开成可读的汇编。
💡 金句
We have seen in a previous post that switch statements are more complex than they seem.
👍 0
👎 0
← 返回 Hacker News 首页