1、由来
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要非常注意的是对递归函数的内联扩展可能带来部分编译器的无穷编译。
设计内联函数动机
内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。
没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。
此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块。
维基百科:http://zh.wikipedia.org/wiki/%E5%86%85%E8%81%94%E5%87%BD%E6%95%B0
2、GCC内联解释
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Inline.html
3、理解inline不是关键词。是对于编译器处理的建议,但我们指定编译器去优化时编译器才会给我们去优化。
4、优点牺牲主函数空间来节约被调函数调用的时间,即函数入栈于出栈的时间。
5、gcc对内联的处理。
例如:
#include <stdio.h>
int inline abc (int x)
{
return 111;
}
int main(int argc ,char * argv[])
{
int x = abc(1);
return 0;
}gcc test_inline.c -S -o a.i
查看x86汇编代码,并没有优化。那什么时候优化呢。我们加入优化选项-O试一下。
main:
.LFB1:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $20, %esp
movl $1, (%esp)
call abc
movl %eax, -4(%ebp)
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endprocgcc test_inline.c -S -O -o a.i
main:
.LFB23:
.cfi_startproc
movl $0, %eax
ret
.cfi_endproc从这里可以看出C99默认不会去给我们优化inline,但我们制定-O(大写O)时才会优化代码。其他优化等级不去试验了。我猜测应该也是优化的。
C89不支持内联函数。