使用 inline 关键字是否值得,或者编译器是否足够聪明,知道何时需要内联函数?
使用 inline 关键字是否值得,或者编译器是否足够聪明,知道何时需要内联函数?
是的,它非常智能。但在过去40年里,C程序构建的方式没有任何进展。仍然是一次只处理一个源代码文件。
因此,如果要在多个.c文件中内联一个函数,则将函数定义放在.h文件中。如果您没有标记为inline,链接器会抱怨有多个定义。
extern inline
函数,没有 static
修饰符 inline
关键字无效,函数的多个定义从来都是不被允许的。 - R.. GitHub STOP HELPING ICE编译器非常智能,具有多个度量标准来确定是否值得内联。但是有时候开发人员会知道应用程序的运行方式,并且知道要内联一些编译器不能自动完成的内容。不过,除非我进行了基准测试并发现内联能够提高性能,否则我不会手动内联任何东西。
您可以阅读更多关于GCC如何使用内联的信息。
明确意图总是值得的。
同时值得注意的是,编译器甚至不需要内联,如果它认为不内联更好。
标准规定
7.1.2 函数说明符
2. 具有内联说明符的函数声明(8.3.5、9.3、11.4)声明了一个内联函数。内联说明符表示实现应该优先选择在调用点处对函数体进行内联替换,而不是使用通常的函数调用机制。实现不需要在调用点执行此内联替换;但是,即使省略了此内联替换,仍然必须遵守由 7.1.2 定义的内联函数的其他规则。
因此,我认为 inline
可以类比于 HTML 中的 <br />
-- 始终使用自闭合的 <br />
是一种良好的实践。但是,有人可能会争辩说,几乎所有浏览器的实现都完全相同地处理 <br>
和 <br />
,这在我看来忽略了重点。
正如其他人所指出的那样,在当今这个时代,这可能并不非常相关于性能价值。但我认为它仍然可以作为一个语义上的、表达意图的关键字。