要: 编译器优化是嵌入式领域最容易被忽视的性能杠杆。很多工程师只知道把优化等级调到 -O3,结果代码更大、运行更慢、甚至偶发诡异 Bug。本文拆解 GCC/Clang 各优化等级在 Cortex-M 上的真实表现,实测 LTO(链接时优化)的实际收益,系统整理 __attribute__ 的十种高频用法,并复盘五个"优化引入隐蔽 Bug"的真实案例。包含实测数据和完整避坑清单。
一、引子:调到 -O3 后,代码变慢了
去年接手一个图像处理项目,STM32H743 @480MHz,代码跑边缘检测算法,单帧耗时 38ms,目标是压到 30ms 以内。
第一反应:优化等级从 -O2 调到 -O3。重新编译,烧录,测试——
单帧耗时 42ms,比之前还慢了 4ms。
团队里几个人都愣了。-O3 不是应该更快吗?为什么反而更慢?
用 arm-none-eabi-size 对比两个版本:
lash 涨了 68KB,RAM 涨了 16KB,性能反而下降。
根因: -O3 的向量化和循环展开让代码体积暴涨,超出了 S