一个函数被定义成inline 函数. 那么就跟macro 宏一样, 在编译器编译的时候,如果编译器发现你的函数是inline类型的,就把你编译成inline code.

编译器编译原文件以后,会单独把inline函数列出来.然后当有地方调用inline函数的时候,就会直接把编译好的inline code 插入到调用的这个地方.

普通的函数调用一个函数,在汇编成面,会有一个函数调用,找到这个函数的地址,然后传递参数给这个函数,然后执行这个函数,最后从函数出返回值.然后堆栈又要恢复调用这个函数前的样子.因此每次调用一次函数都有时间和空间的开销. 如果要调用的函数仅仅是一个小函数,那么每次都重复这样的一个过程肯定非常的浪费时间,并且浪费堆栈的空间,如果是一个递归调用,使用堆栈的空间就更多了. 如果要调用的函数非常长,那么花这个函数调用的时间还是值得的.如果要调用的函数非常的短,那么就可以直接将要调用的函数复制到要调用这个函数的地方.如果函数过长,可以想象每次都要把一个这么长的函数复制到其他地方,是不能接受的. 所以如果一个函数过长,编译器会放弃使用内联的方式.

总结:内联函数本身通过减少函数调用开销来起到优化目的.内联过大的函数不但起不到优化效果,还会导致代码膨胀,增加内存换页次数,得不偿失.

所以并不是所有地方都用inline 函数,但是可以用macro的地方必定可以用inline替换.

inline 是一个对函数的定义修饰的一个修饰符. 所以如果是 inline int max(int a, int b); 是没用的, 这里是函数的声明,不是函数的定义.

inline 即使函数的声明没声明inline, 函数的定义声明是Inline就可以了.

tips: 注意在类定义里给出定义的方法会自动内联.


<
Previous Post
c++泛型单例模式
>
Next Post
c++ 对象模型