静态和内联(static and inline)

2019-09-16 21:22发布

在C.荫编程我想了解的静态和内联函数的一些描述。 我知道,如果我们做一个功能的静态那么它是编译器,它是根据内部链接只有一个翻译单元的指示。 我有一个关于静态和内联下面的疑惑:

  1. 如果我们做一个函数作为静态的,我们可以用它在其他翻译单元...即在其他.c文件? 如果是..how?
  2. 如果我们做的函数为静态内嵌有什么区别呢? 怎么会被编译器处理?
  3. 是不是只要一个函数作为静态给宏同样的效果?
  4. 处理的功能的内联是依赖于根据其大小的编译器。 那么,有没有办法,我们可以有力地使其像内联可以治疗吗?
  5. 我们如何使用内联和静态函数进行优化?

请洒在上面的东西内嵌的一些情况。 平台是Linux,gcc编译器,C语言。

Answer 1:

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

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

  3. 制作一个静态的功能比使用宏不同。 宏基本上否决的编译器。 它是否认为明智的做法是内联与否,宏将内联; 宏文本替换。 您也可以通过一个static函数需要一个函数指针的东西。 不能做到这一点与宏。

  4. 宏将强制内联任何东西。 即使指定inline可以被推翻。

  5. 让你不希望导出功能static 。 如果一个函数是非常小的,你真的认为它应该被内联,你可以告诉编译器对使用inline 。 宏是真的只为元编程。 编译器比你懂得多。



Answer 2:

staticinline服务两个非常不同的目的。

至于你说的正确static表示函数的符号不是从定义它的编译单元出口。 因此,不同的编译单元可以有不冲突的同名这样的符号。 这是否对应于相同的函数声明和定义是你。 但这样的功能,因为所有的静态分配的对象可以很好地在不同的编译单元通过静态或动态出口指向它的指针使用

inline是不同的。 它的目的是使人们有可能对编译器内联的功能,因而得名,但其主要的直接效果是函数符号通常不发出的。 这是专为你可以把函数的定义在头文件,包括该文件在多个编译单元无需在每个人创建多个符号的目的。 对于定义的功能它也有,你是不允许声明的效果static内部变量inline函数,因为它不会是清楚该对象必须实现其编译单元都没有。

因此,要总结, static产生大量的功能的副本, inline产生无; static在它的主要用途".c"文件,并inline".h"

首先有一个可能会在某些地方无法检测到两个函数指针指向“相同”的功能,第二个可能是,如果你需要一个函数指针函数没有函数对象的影响的效果,它会参考。 这样的功能可以通过将一种在.c文件“实例”中被强制发射(只在一个编译单元!):

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

// .c instantiation
void toto(void);


Answer 3:

这几天编译器将决定是否inline函数实际上将内联与否,因为不是所有的功能都不错的候选人了。 如果是,则功能体被简单地注入/内联,其中相应的功能被引用。

这些功能应预留频繁的函数调用其中的函数体通常很短,但我想这不必须是这种情况。



文章来源: static and inline