__inline__是什么意思?

ggg*_*ggg 32 c inline

我正在努力学习C.通过阅读一些代码,我遇到了这样的一行:

__inline__ void () ...
Run Code Online (Sandbox Code Playgroud)

什么__inline__意思?如何将这个词放在函数前面使它与众不同?

GMa*_*ckG 39

__inline__是一个非标准的扩展.通常,它告诉编译器:"内联此函数",但作为非标准扩展,我们不能肯定地说,除非我们知道这是哪个编译器.

内联是删除函数调用并将其内容直接放在调用的位置.这通常会消除调用函数的开销.它并不总是最优的,因为代码膨胀(代码变得太大并且不适合缓存),因此大多数编译器将忽略所有内联指令并执行他们认为最好的操作.这是一件好事.我们人类在这种情况下非常匮乏,并且告诉编译器如何完成它的工作通常被认为是不好的做法.

内联是一项重要的优化,尤其是在辅助函数存在的情况下.想象一个函数返回两个int中较小的一个:

int min(int x, int y)
{
    return (x < y) ? x : y;
}
Run Code Online (Sandbox Code Playgroud)

如果我在我的代码中使用了这个函数,那么实际进行函数调用将是一个巨大的浪费时间.如果我有:

int a = /* some calculation */;
int b = /* some other calculation */;

int minCalc = min(a, b);
Run Code Online (Sandbox Code Playgroud)

并且编译器内联该函数,代码将变为:

int a = /* some calculation */;
int b = /* some other calculation */;

int minCalc = (a < b) ? a : b;
Run Code Online (Sandbox Code Playgroud)

这消除了调用函数的开销.从这里开始,当编译器直接使用通常隐藏在函数调用后面的代码时,可以进行更多优化.正如你所看到的,如果我有一个很大的功能,我强制编译器内联到处它,码量可能增长非常大非常快,而且将实际上阻碍执行速度.

有一个标准的inline关键字用于向编译器指示一个函数应该内联,但是现在大多数编译器甚至都不承认它是内联函数的提示.

但是,有一个重要的副作用inline,这可能是有用的.如果函数被标记为inline,则跨多个转换单元的相同函数的多个定义不是错误.相反,选择单个函数定义,抛出其他函数定义,并假设它们是相同的(这取决于您确保这实际上没问题!).这允许您在头文件中定义函数,而不会有ODR违规错误的风险.

  • 另外,我很确定C99有一个"内联"关键字,就像C++一样. (3认同)

Ano*_*on. 7

Inline是编译器内联函数的建议 - 它不是为函数和call指令生成代码块,而是在任何地方使用它,它可以有效地将生成的代码剪切并粘贴到调用该函数的任何地方.

它通常只是一个建议 - 虽然它可以在紧密循环中调用它可以提高性能,但它通常会增加内存使用量,这通常会产生负面的性能影响.编译器将自己决定是否内联函数 - 它可能需要"程序员建议内联这一点",但是(在大多数编译器上),简单地将函数声明为内联并不能保证它将是.


eph*_*ent 5

维基百科/内联函数

计算机科学中内联函数是一种编程语言结构,用于告诉编译器它应该对特定函数执行内联扩展。换句话说,编译器将在使用该函数的代码中的每个位置插入函数的完整主体。

海湾合作委员会手册 § 5.36

如果你正在编写被纳入ISO C89程序的头文件,写__inline__代替inline。请参阅备用关键字