C语言:使用inline关键字是否值得?

8

使用 inline 关键字是否值得,或者编译器是否足够聪明,知道何时需要内联函数?


4
一个不值得回答的评论:如果你不打算在编译单元之外使用该函数,那么关键字“static”对编译器的帮助比“inline”更大。编译器可以在只有一个调用点时无论大小都进行内联。 - Pascal Cuoq
4个回答

15

是的,它非常智能。但在过去40年里,C程序构建的方式没有任何进展。仍然是一次只处理一个源代码文件。

因此,如果要在多个.c文件中内联一个函数,则将函数定义放在.h文件中。如果您没有标记为inline,链接器会抱怨有多个定义。


2
+1,“inline”现在意味着“允许多个定义”。它也是提示编译器“使调用此函数快速”的副作用无关且不相关。我认为“程序构建方式”并没有停滞不前——一些编译器/链接器已经有所进步。但标准允许的最低公共分母并没有进步。 - Steve Jessop
11
说“inline”的意思是“允许多个定义”是错误的。这个问题涉及到 C 语言,而不是 C++。C 没有 extern inline 函数,没有 static 修饰符 inline 关键字无效,函数的多个定义从来都是不被允许的。 - R.. GitHub STOP HELPING ICE

10

编译器非常智能,具有多个度量标准来确定是否值得内联。但是有时候开发人员会知道应用程序的运行方式,并且知道要内联一些编译器不能自动完成的内容。不过,除非我进行了基准测试并发现内联能够提高性能,否则我不会手动内联任何东西。

您可以阅读更多关于GCC如何使用内联的信息。


编译器还是以前的处理方式吗? - Build Succeeded

3

明确意图总是值得的。

同时值得注意的是,编译器甚至不需要内联,如果它认为不内联更好。


0

标准规定

7.1.2 函数说明符

2. 具有内联说明符的函数声明(8.3.5、9.3、11.4)声明了一个内联函数。内联说明符表示实现应该优先选择在调用点处对函数体进行内联替换,而不是使用通常的函数调用机制。实现不需要在调用点执行此内联替换;但是,即使省略了此内联替换,仍然必须遵守由 7.1.2 定义的内联函数的其他规则。

因此,我认为 inline 可以类比于 HTML 中的 <br /> -- 始终使用自闭合的 <br /> 是一种良好的实践。但是,有人可能会争辩说,几乎所有浏览器的实现都完全相同地处理 <br><br />,这在我看来忽略了重点。

正如其他人所指出的那样,在当今这个时代,这可能并不非常相关于性能价值。但我认为它仍然可以作为一个语义上的、表达意图的关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接