静态和内联

时间:2012-04-30 04:18:30

标签: c linux optimization gcc inline

我在C中编程。我想要一些关于静态和内联函数的描述。我知道如果我们将函数设为静态,那么它表明编译器只在一个转换单元的内部链接下。 我对静态和内联有疑问:

  1. 如果我们将函数设为静态函数,我们是否可以在其他翻译单元中使用它...即在其他.c文件中?如果是..how?
  2. 如果我们将函数设为静态内联,那么有什么区别呢?它将如何被编译器处理?
  3. 将函数设为静态会产生与宏相同的效果吗?
  4. 处理内联函数取决于编译器的大小。那么有什么方法可以强制让它像内联一样对待吗?
  5. 我们如何使用内联和静态函数进行优化?
  6. 请详细了解上述内容。 平台是Linux,gcc编译器,C语言。

3 个答案:

答案 0 :(得分:4)

  1. static函数不能用于其他翻译单元。这是他们的存在理由。

  2. inline提示编译器应该内联函数而不是调用函数。

  3. 使函数静态与使用宏不同。宏基本上否决了编译器。无论是否认为内联是否明智,都会内联一个宏;宏是文本替代。您还可以将static函数传递给需要函数指针的函数。不能用宏来做到这一点。

  4. 宏会强行插入任何内容。即使指定inline也可以推翻。

  5. 制作您不想导出static的功能。如果函数非常小,并且您确实认为它应该内联,那么您可以使用inline告诉编译器。宏实际上只用于元编程。编译器比你更了解。

答案 1 :(得分:3)

staticinline有两个截然不同的目的。

正如您所说的那样static意味着函数的符号不会从定义它的编译单元中导出。因此,不同的编译单元可以具有相同名称的此类符号而不会发生冲突。这是否对应于相同的函数声明和定义取决于您。但是,通过静态或动态地将指针导出到不同的编译单元中,所有静态分配的对象等函数都可以使用

inline不同。它的目的是使编译器能够内联你的函数,即名称,但其主要的直接影响是函数符号通常根本不会被发出。这样做的目的是您可以将函数的定义放在头文件中,并将该文件包含在多个编译单元中,而不在每个编译单元中创建多个符号。对于定义的函数,它还具有不允许在static函数内声明inline变量的效果,因为根本不清楚该对象必须在哪个编译单元中实现

总而言之,static会生成大量的函数副本,inline不生成任何副本; static主要用于".c"个文件和inline中的".h"

第一个有效的是你可能在某些地方没有检测到两个函数指针指向“相同”的函数,第二个可能会产生这样的效果:如果你需要一个函数指针指向函数,那么就没有函数对象它会引用它。这样的  通过在.c文件中放置一种“实例化”,可以强制发出函数(仅在一个编译单元中!):

// .h definition
inline void toto(void) { }

// .c instantiation
void toto(void);

答案 2 :(得分:1)

这些天编译器将确定内联函数是否实际内联,因为并非所有函数都适合它。如果是这样,则只需注入/内联函数体,其中引用相应的函数。

这些函数应保留用于频繁的函数调用,其中函数体通常很短,但我认为这不是必须的。

相关问题