4.3.内联

内联是在调用点为函数插入代码的过程。优势:

  • 节省函数调用开销。
  • 允许优化器在周围代码上下文中优化函数。

当调用内联函数时,在调用点插入该函数的 C/C++ 源代码副本。内联函数扩展可以通过消除函数调用开销来加快执行速度。这对于经常调用的非常小的函数或仅调用很少几次(一两次)的较大函数特别有用。函数内联涉及到在执行速度和代码大小之间进行权衡,因为代码在每个函数调用点都是重复的。

表 4.5 列出了在启用或未启用内联的情况下执行列表 4.9 中函数序列的周期数。

foo1调用 foo2,后者会调用 foo3,而后调用 foo4。使用 static 可以让编译器在内联后删除函数体。这样就无需拥有多个函数副本,从而减少代码大小。

表 4.5 比较闪存与 RAM 的代码执行次数
说明 F28004x 上的周期数
–opt_level=3。使用 –auto_inline=0 禁用内联 58
–opt_level=3(在此优化级别默认启用内联)。周期数的减少是由于内联消除了调用指令和额外的优化机会。 19
列表 4.9 用于说明内联优势的函数调用序列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
floatfoo1(floatf1,floatf2){returnf1*f2+foo2(f1,f2);}staticfloatfoo2(floatf1,floatf2){returnf1*2.0f-foo3(f1,f2);}staticfloatfoo3(floatf1,floatf2){returnf2*4.0f-foo4(f1,f2);}staticfloatfoo4(floatf1,floatf2){returnf1*(f2-f1);}

有不同的方法来控制内联范围以管理执行速度和代码大小之间的权衡。

  • 如果工程是使用 --opt_level=3 (-O3) 或更高版本编译的。

    -O3副作用是在工程中的所有文件之间启用内联,并会导致代码大小显著增加。将 --auto_inline=[size]--opt_level=3 搭配使用可以对内联的函数的大小加以限制。如有需要,可以在 -O3 处使用 --auto_inline=0-oi0 禁用内联。如需了解详情,请参阅 TMS320C28x 优化 C/C++ 编译器用户指南中的第 3.5 节“自动内联扩展(--auto_inline 选项)”。

  • 如果工程是使用 --opt_level=1--opt_level=2

    对将从内联到调用站点中受益的特定函数使用 staticinline

如需了解详情,请参阅 TMS320C28x 优化 C/C++ 编译器用户指南中的第 2.11 节“使用内联函数扩展”。