一个例子来说明内联的好处。sinCos.h:
int16 sinLUT[ TWO_PI ];
static inline int16_t cos_LUT( int16_t x ) {
return sin_LUT( x + PI_OVER_TWO )
}
static inline int16_t sin_LUT( int16_t x ) {
return sinLUT[(uint16_t)x];
}
当进行一些繁重的数字运算并且您希望避免在计算 sin/cos 上浪费周期时,您将 sin/cos 替换为 LUT。
当您在没有内联的情况下编译时,编译器不会优化循环,输出 .asm 将显示以下内容:
;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;* Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*
当您使用内联编译时,编译器了解循环中发生的事情并将进行优化,因为它确切地知道发生了什么。
输出 .asm 将有一个优化的“流水线”循环(即,它将尝试充分利用所有处理器的 ALU 并尝试在没有 NOPS 的情况下保持处理器的流水线满)。
在这种特定情况下,我能够将我的性能提高大约 2 倍或 4 倍,这使我能够满足我的实时截止日期所需。
ps 我正在使用定点处理器......任何浮点运算,如 sin/cos 都会影响我的性能。