c - __inline__ 是什么意思?

标签 c inline

我正在尝试学习 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/

相关文章:

html - gmail 从表中剥离内联 css

更改内存地址而不是 C 上结构中的值

c - 解析命令仅适用于单字命令

c: 在内核模块中重命名文件

generics - Kotlin 实体化类型参数不智能转换

css - p style=显示 :inline trouble

css - 强制内联显示响应式图像

c++ - 通常不内联的成员函数之前有多大?

循环遍历数组遍历元素计数

c - 当我使用 int 或 double 时,为什么在 c 中得到两个不同的输出?