📘 嵌入式C编译器优化规范
要点·30章
🎯 友好色系
01
引言
背景与资源限制
为什么需要编译器优化?嵌入式系统的资源限制与性能需求。
02
概览
GCC/Clang & 优化级别
GCC与Clang/LLVM简介,优化级别(-O0~-Os)的含义与选择。
03
语法语义
C标准 & 未定义行为
C语言标准(C99~C23)对优化的影响,未定义行为(UB)与优化的关系。
04
volatile
防止过度优化
volatile的作用、使用场景(硬件寄存器、中断共享变量),防止过度优化。
05
const/restrict
优化潜力
const的优化潜力,restrict指针别名优化,实际应用案例。
06
内联函数
inline利弊
函数内联的利弊,何时使用inline,编译器内联决策机制。
07
静态 & LTO
链接时优化
static函数的作用域与优化,LTO(链接时优化)的原理与配置。
08
循环展开
基础优化
循环展开(Loop Unrolling)的原理、手动展开与编译器自动展开。
09
循环合并/交换
进阶
循环合并与分布(Loop Fusion/Distribution),循环交换(Loop Interchange)。
10
向量化
SIMD & 对齐
循环向量化(Loop Vectorization),SIMD指令集利用,数据对齐要求。
11
分支优化
likely/unlikely
条件表达式优化,likely/unlikely宏,__builtin_expect的使用。
12
调用优化
尾调用 & 参数传递
尾调用优化(Tail Call Optimization),函数参数传递优化。
13
内存访问
缓存友好性
缓存友好性(Cache Friendly),数据局部性原理,结构体布局优化。
14
对齐与填充
结构体重排
数据对齐要求,结构体成员重排,__attribute__((packed))的代价。
15
全局/静态
变量优化
全局变量的优化限制,静态变量的初始化优化,线程本地存储。
16
指针别名
严格别名规则
指针别名问题,严格别名规则(Strict Aliasing),-fstrict-aliasing选项。
17
内联汇编
asm volatile
asm volatile的使用场景,约束条件,优化器与内联汇编的交互。
18
内置函数
Built-in Functions
GCC/Clang常用内置函数,如__builtin_popcount, __builtin_clz等。
19
属性
noreturn/const/pure..
__attribute__((noreturn)), ((const)), ((pure)), ((hot)), ((cold))等。
20
Pragma指令
局部优化开关
GCC pragma,优化开关的局部控制,如#pragma GCC optimize。
21
调试vs优化
-Og级别
优化对调试信息的影响,-Og优化级别,调试与性能的平衡。
22
代码大小
-Os & 代码膨胀
-Os优化级别详解,代码膨胀的常见原因,大小与速度的权衡。
23
启动时间
初始化 & 链接脚本
初始化代码优化,.bss和.data段处理,链接脚本优化。
24
ISR优化
中断服务程序
ISR的编写规范,最小化延迟,volatile与ISR。
25
RTOS优化
任务切换 & 栈
任务切换开销,栈空间优化,信号量与互斥锁的优化。
26
浮点运算
软/硬浮点
软浮点与硬浮点,-mfloat-abi选项,浮点运算的替代方案。
27
链接器优化
段合并/GC
链接脚本定制,段合并,垃圾回收(--gc-sections),符号剥离。
28
性能分析
gprof/perf/PGO
gprof, perf, valgrind的使用,基于profile的优化(PGO)。
29
实战案例
从-O0到-Os调优
一个实际嵌入式项目的优化全过程,从-O0到-Os的调优。
30
总结
最佳实践 & 未来
优化检查清单,常见陷阱,未来趋势(MLIR, 多级中间表示)。