内联函数

时间:2012-03-30 15:54:21

标签: c optimization inlining

我在Linux中使用gcc在C中进行开发。

我正在以下列方式在.H和.C文件中组织我的小函数

      // .H file
      extern int my_function( int val );

      // .C file
      inline int my_function( int val ){
          // my job..very short!
      }

这些功能很小,所以它们非常适合内联,但我不知道它们是否可以肯定。

我对我组织文件的方式存有疑问,我认为将所有函数直接内联到没有.C文件的.h文件中可能会更好。 你能帮我澄清一下我的疑问吗?

3 个答案:

答案 0 :(得分:3)

首先,请注意,您可以通过添加-finline-functions选项告诉 gcc 尝试将小功能内联到其呼叫者中。

如果您对您的功能实际内联有任何疑问,可以通过-Winline

要求 gcc 警告您无法使用的功能

此处,由于您的函数同时声明为externinline,因此内联,因为inline定义仅用于内联。在这种特殊情况下,函数根本不会自行编译。

阅读http://gcc.gnu.org/onlinedocs/gcc/Inline.html了解更多详情。

答案 1 :(得分:2)

无论你的功能有多小,选择是编译器是否内联它。

因此,即使您的代码数量非常少而且在代码中将它们全部内联,也无法保证所有函数都会被编译器内联。

您可以在内联here中找到一些有用的内容。

答案 2 :(得分:0)

首先,编译器必须能够看到函数的定义才能内联它。因此,您必须将定义放在头文件中。 (这里,我假设您的应用程序包含多个源文件)。注意:某些开发环境支持多文件编译,在这种情况下,此注释不适用。

其次,如果你习惯了C ++(事物"只是工作"),内联C99的语义有点令人困惑。在C99中,您必须挑出一个拥有该函数的单个源文件(而不是头文件) - 如果某个源文件中没有内联该函数,则必须存在该函数的一个明确定义。这是通过使用extern关键字指定函数来完成的。 (这是对extern的传统解释的偏离,它仅用于声明。)

例如:

  // .h file
  inline int my_function( int val )
  {
      // my job..very short!
  }

  // In ONE .c file
  extern int my_function( int val );