http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Inline.html#Inline
1 gnu实现使用内联提升性能的两种方式:
1.1 将内联函数代码集成到调用函数代码中,从而节省函数调用过程带来的开销;
1.2 如果内联函数有参数的实际参数值为常量,则可以在编译时简化代码????????
2 gnu实现内联函数时的三种不同语义:
2.1 -std=gnu89, -fgnu89-inline, gnu_inline;
2.2 -std=gnu99, -std=c99;
2.3 编译c++时使用。
3 使用inline函数的两种类似情况,在这两种情况中,该函数在上面2中的三种语义条件下都有类似的行为:
(1)static函数中使用inline关键字,如:
static inline int inc(int *a) { (*a)++; }
(2)声明时未使用inline关键字,定义时使用该关键字,如:
extern int inc(int *a);
inline int inc(int *a) { (*a)++; }
这时,当调用该内联函数的调用都能够将内联函数集成到调用函数中时,编译器不会为该函数产生独立的编译代码。如果有调用不能被集
成到调用函数中或者该内联函数的地址被直接引用时,该内联函数的代码将被独立编译。
4 是函数不适宜进行函数替换内联的函数定义中的行为:如使用不定数量的参数,函数中使用alloc,使用变长数据类型,嵌套函数定义,非
本地goto语句等。
5 如同iso c++所要求的,gcc会将在类中定义的成员函数认为是内联的,即使他们没有显示的使用inline关键字。
6 当不进行优化 时,gcc不会内联任何函数,除非为该函数指定了‘always_inline'属性:
inline void foo(const char) __attribute__((always_inline));
针对GNU89的内联行为:
1 当内联函数没有使用static进行限制时,编译器认为该函数可能会被其他程序文件调用,而全局符号不能被多次定义。所以对该函数的调用
不能被集成展开,因此该函数会被独立的编译调用,从而失去内联函数的特性。
2 如果函数的定义 同时被extern和inline修饰,该函数会拥有内联函数的性质而不会被独立编译。该函数对应的地址会成为一个外部引用,但
行为类似你仅仅声明了该函数而没有对其定义。
inline和extern的联合使用是函数具有类似宏的效果。使用它的方式通常是在头文件中通过extern和inline给出一个函数定义 ,然后在库文件
中不使用这两个关键词给出一个函数定义。头文件中的函数定义会使该函数具有内联行为。
使用inline函数的几种策略:
http://www.greenend.org.uk/rjk/2003/03/inline.html
1 一种简单的可移植方法:使用static inline.
2 使用gnu c的方法:使用extern inline
3 使用c99的方法:头文件中使用inline,源文件中使用extern inline
参考:http://dionysus.blogbus.com/logs/31152920.html
http://www.slacker.org/brandon/programming/inline.html