Appearance
编译、链接与代码优化专题(Build toolchain / optimization)
HPC/AI Infra 高频问:你懂不懂编译流程、为什么开 -O3 快、-march=native、LTO/PGO、ABI、链接、符号、内联都怎么影响性能与正确性。
问题清单(含答案)
1. gcc 编译 .cpp → 可执行中间发生什么?
答案
预处理(展开宏/头文件)→ 编译(.c→.s 汇编,每个 TU 独立)→ 汇编(.s→.o)→ 链接(合并 .o + 库 → 可执行)。详见 compile-link.md。
2. 静态库(.a) vs 动态库(.so)?
答案
.a 链接时拷贝进可执行,独立但体积大、更新需重链;.so 运行时共享加载,小、可独立更新但依赖版本。详见 compile-link.md。
3. 头文件 / 编译单元 / ODR / include guard / inline 的关系?
答案
头文件是文本粘贴;编译单元 = 一个 .cpp 展开后;ODR 要求单一定义;include guard 防重复包含;inline 允许在头文件定义不违反 ODR。
4. 优化开关 -O2/-O3/-Os/-Ofast/-march=native?
答案
-O0 无优化;-O2 常规优化;-O3 更激进(含向量化);-Os 体积优先;-Ofast 允许违反 IEEE 精度(危险);-march=native 用本机全部指令集。详见 optimization-flags.md。
5. 内联 inline:编译器真的会内联吗?跨 TU 内联?LTO 解决什么?
答案
inline 只是建议、编译器决定是否内联。跨编译单元通常看不到定义无法内联 → LTO(链接时优化)看到全貌,可跨 TU 内联/常量传播。
6. LTO / PGO 原理与收益?
答案
LTO 链接期整体优化(跨文件内联);PGO 用运行 profile 指导优化(热点/分支)。都能带来可观性能提升,代价是编译变慢。详见 optimization-flags.md。
7. 符号:mangling、extern "C"、可见性、static/匿名命名空间?
答案
mangling 把函数签名编码进符号名;extern "C" 禁用修饰供 C 链接;-fvisibility=hidden 控制导出;static/匿名命名空间限制内部链接。详见 abi-symbol.md。
8. ABI / 二进制兼容 / 标准库 ABI 风险?
答案
ABI 是二进制接口(符号、调用约定、类布局)。改类布局/加虚函数会破坏二进制兼容;标准库 ABI(如 _GLIBCXX_USE_CXX11_ABI)混用会链接错乱。详见 abi-symbol.md。
9. 段:.text/.data/.bss/.rodata?
答案
.text 代码、.data 已初始化全局、.bss 未初始化(占位不占文件空间)、.rodata 只读常量,都映射进进程虚拟内存。见 memory/layout.md。
10. 开优化后 debug vs release 时序差很大?如何权衡?
答案
优化会内联/重排/消除,debug 无优化所以慢很多。用 -Og(为调试优化的级别)或 release 分发包带 -g 符号、加 -fno-omit-frame-pointer 保留可调式性。
子文档
| 文件 | 内容 |
|---|---|
index.md | 本总览 |
compile-link.md | 编译流程、静态/动态库、预处理 |
optimization-flags.md | 优化级别、inline/LTO/PGO、march、fast-math |
abi-symbol.md | ABI、mangling、符号可见性、二进制兼容 |