“inline”关键字在C中有什么用途?
我在stackoverflow中读到了几个关于C语言内联的问题,但仍然不清楚“inline”关键字在C中有什么用途?,c,inline,c99,C,Inline,C99,我在stackoverflow中读到了几个关于C语言内联的问题,但仍然不清楚 static inline void f(void){}与static void f(void){}没有实际区别 代码> C中的内联空格F(空隙){} /Case>不作为C++方式工作。它在C语言中是如何工作的 extern内联void f(void)的实际作用做什么 我从来没有在我的C程序中真正发现使用inline关键字,当我在其他人的代码中看到这个关键字时,它几乎总是静态inline,在这个函数中,我只看到静态一个
static inline void f(void){}
与static void f(void){}
没有实际区别extern内联void f(void)的实际作用代码>做什么
我从来没有在我的C程序中真正发现使用
inline
关键字,当我在其他人的代码中看到这个关键字时,它几乎总是静态inline
,在这个函数中,我只看到静态一个所有声明(包括定义)都提到inline而从不使用extern的函数。
同一翻译单元中必须有一个定义。标准将其称为内联定义。
不会发出独立的目标代码,因此无法从其他翻译单元调用此定义
在本例中,所有声明和定义都使用内联而不是外部:
// a declaration mentioning inline
inline int max(int a, int b);
// a definition mentioning inline
inline int max(int a, int b) {
return a > b ? a : b;
}
是一个参考,它可以让您更清楚地了解C中的内联函数以及内联和外部函数的用法 来自C11规范中的6.7.4功能说明符
6使用内联函数说明符声明的函数是内联函数
功能。使函数成为内联函数意味着调用
函数必须尽可能快。138)在多大程度上
这些建议是有效的
已定义实施.139)
138)例如,通过使用常规函数调用的替代方法
机制,例如内联替换。内联替换不可用
文本替换,也不会创建新功能。所以,,
例如,在函数体中使用的宏的展开
函数使用它在函数体上的定义
出现,而不是调用函数的位置;和标识符是指
到主体出现的范围中的声明。同样地
函数只有一个地址,而不管内联地址的数量如何
除外部
定义
139)例如,一个实现可能
从不执行内联替换,或者可能只执行内联替换
内联声明范围内调用的替换
它建议编译器广泛使用此函数,并要求在调用此函数时优先考虑速度。但对于现代智能编译器,这可能或多或少是无关紧要的,因为编译器可以决定函数是否应该内联,并且可以忽略用户的内联请求,因为现代编译器可以非常有效地决定如何调用函数
static内联void f(void){}
与static没有实际区别
void f(void){}
因此,对现代编译器来说,大多数情况下都是这样。任何编译器都不存在实际/可观察的输出差异
<代码>在C中内联空f(空隙){} /CONT>不作为C++方式工作。怎么样
在C工作
任何地方都是内联函数,C++中必须是内联的,链接器不抱怨多个定义错误(定义必须相同)。p>
外部内联void f(void)实际上是什么;是吗
这将提供到f
的外部链接。由于f
可能存在于其他编译单元中,编译器可能会选择不同的调用机制来加速调用,或者可能会完全忽略内联
。作为“内联”一词,在“行”中添加此关键字会在运行时影响程序,当编译程序时,函数内部编写的代码粘贴在函数调用下面,因为函数调用比内联代码更昂贵,所以这优化了代码。
所以
静态内联void f(void){}和静态void f(void){},在这个内联关键字中,do在运行时会有所不同。但当函数有太多的代码行时,它不会影响运行时。
如果在函数之前添加static,则函数的生命周期就是整个程序的生命周期。该函数的使用仅限于该文件。
要了解extern,您可以参考-C代码可以通过两种方式进行优化:代码大小和执行时间
内联函数:
说,
通过内联声明函数,您可以指示GCC更快地调用该函数。GCC实现这一点的一种方法是将该函数的代码集成到其调用者的代码中。这通过消除函数调用开销使执行更快;此外,如果任何实际参数值是常量,那么它们的已知值可能允许在编译时进行简化,因此不需要包含所有内联函数的代码。对代码大小的影响不太可预测;根据具体情况,使用函数内联的目标代码可能更大或更小
因此,它告诉编译器将函数构建到使用它的代码中,以提高执行时间
如果您声明了一些小功能,如设置/清除标志或某些位切换,这些功能重复执行,inline
,它可能会在时间上产生很大的性能差异,但代价是代码大小
非静态内联和静态内联
再次提到,
当内联函数不是静态函数时,编译器必须假设可能有来自其他源文件的调用;由于全局符号在任何程序中只能定义一次,因此函数不能在其他源文件中定义,因此其中的调用无法集成。因此,非静态内联函数总是以通常的方式自行编译
外部内联?
再说一遍,这一切都说明了:
如果在fu中同时指定内联和外部