我正在尝试学习 C。通过阅读一些代码,我遇到了这样一行:
__inline__ void () ...
__inline__
是什么意思?将这个词放在函数前面如何让它与众不同?
最佳答案
__inline__
是一个非标准 扩展。通常,它会告诉编译器:“内联此函数”,但作为非标准扩展,我们不能肯定地说,除非我们知道它在哪个编译器上。
内联就是删除函数调用并将它的内容直接放在调用的地方。这通常会消除调用函数的开销。它并不总是最优的,因为代码膨胀(代码变得太大并且不适合缓存),所以大多数编译器会忽略所有内联指令并做他们认为最好的事情。 这是一件好事。我们人类在这类事情上很差,告诉编译器如何完成工作通常被认为是不好的做法。
内联是一项重要的优化,尤其是在存在辅助函数的情况下。想象一个函数返回两个整数中较小的一个:
int min(int x, int y)
{
return (x < y) ? x : y;
}
如果我在我的代码中使用这个函数,那么在此处实际进行函数调用会浪费大量时间。如果我有:
int a = /* some calculation */;
int b = /* some other calculation */;
int minCalc = min(a, b);
编译器内联该函数,代码将变为:
int a = /* some calculation */;
int b = /* some other calculation */;
int minCalc = (a < b) ? a : b;
这消除了调用函数的开销。从这里开始,可以进行更多优化,因为编译器可以直接处理通常隐藏在函数调用后面的代码。如您所见,如果我有一个大函数并且我强制编译器在所有地方内联它,代码大小可能会非常非常快地增长,并且实际上会阻碍执行速度。
有一个标准的 inline
关键字,用于向编译器指示函数应该内联,但现在大多数编译器甚至不承认它是内联函数的提示。
不过,inline
有一个重要的副作用,这很有用。如果一个函数被标记为 inline
,那么跨多个翻译单元对同一函数的多个定义不是错误。取而代之的是,一个函数定义被选中,其他的被丢弃,并假定它们是相同的(由您来确保这实际上没问题!)。这使您可以在头文件中定义函数,而不会出现 ODR 违规错误。
关于c - __inline__ 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082551/