Skip to content

编译、链接与代码优化专题(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.mdABI、mangling、符号可见性、二进制兼容

糌粑的面经笔记 · VitePress 版