循环嵌套深层调用的子程序可能会被调用数千次。即使每次调用花在每个例程上的时间很少,但累加效果却可能会很大。另外,由于编译器在调用期间不能对寄存器状态作出假设,所以子程序调用会抑制包含这些调用的循环的优化。
子程序调用的自动内联(使用 -inline=x,y,..z 或 -O4)是一种让编译器用子程序本身替换实际调用的方法(即将子程序拉到循环中)。要内联的例程的子程序源代码必须与调用例程存在于相同的文件中。
还有其他几种消除子程序调用的方法:
使用语句函数。如果正在调用的外部函数是一个简单的数学函数,可以将该函数改写为语句函数或语句函数集。语句函数采用内联编译,可以进行优化。
将循环推到子程序中。即改写子程序,减少其调用次数(循环外),并使其在每次调用时能对向量或数组值进行操作。