gcc的内联支持

 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

你可能感兴趣的:(linux,c/c++)