C++ inline函数
时间:2010-12-15 来源:charley_yang
但是C++调用一个函数被直接计算一段代码慢很多。不但必须拷贝两个实参,保存机器的寄存器,程序还必须转向一个新位置。
inline 内联函数给出了一种解决方案。
若一个函数被指定为inline 函数,则它将在程序中每个调用点上被内联地展开,例如:
int minVal2 = min( i, j );
在编译时被展开为
int minVal2 = i < j << i : j;
把 min()写成函数的额外执行开销从而被消除了在函数声明或定义中的函数返回类型前加上关键字 inline 即把 min()指定成为 inline:
inline int min( int v1, int v2 ) { /* ... */ }
但是注意,inline 指示对编译器来说只是一个建议,编译器可以选择忽略该建议,因为把一个函数声明为inline 函数,并不见得真的适合在调用点上展开,例如 一个递归函数,或一个 1200行的函数也不太能在调用点展开
一般地 inline 机制用来优化小的只有几行的,经常被调用的函数。
注意事项:
1. 与非 inline函数不同的是 inline 函数必须在调用该函数的每个文本文件中定义
当然,对于同一程序的不同文件,如果 inline 函数出现的话,其定义必须相同;对于由两个文件 compute.C和 draw.C构成的程序来说,不能定义这样的min()函数,它在 compute.C中指一件事情,而在 draw.C中指另外一件事情,如果两个定义不相同,程序将会有未定义的行为,编译器最终会使用这些不同定义中的哪一个作为非inline 函数调用的定义是不确定的,因而程序的行为可能并不像你所期望的
2. 为保证不会发生这样的事情,建议把inline 函数的定义放到头文件中,在每个调用该 inline函数的文件中包含该头文件,这种方法保证对每个inline 函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命期中引起无意的不匹配的事情 。