14

可能重复:
我应该何时为函数/方法编写关键字“内联”?

所以这是一个困扰我一段时间的问题,我无法得到明确的答案。我的理解是,一个好的编译器通常会意识到内联函数既安全又有利,如果打开优化,它将内联所有此类函数,因为它们被明确标识为内联函数由程序员决定。此外,编译器将识别何时内联函数不安全/不明智,并且在这种情况下将简单地忽略程序员对内联函数的请求。

因此,我想知道将函数明确声明为内联函数有什么好处?只要打开优化,编译器就会内联它认为内联的所有函数,并且只内联那些函数。

由于嵌套的 h 文件,我发现了一些关于内联保护免受多个定义的讨论,但肯定 #ifdefine'ing 标头源代码是更好的做法,并且再次使关键字内联无效?

4

2 回答 2

15

您对编译器优化很了解。你对什么inline是错误的假设是错误的。尽管名称inline不是为了优化。inline主要是“违反”单一定义规则而不受惩罚。基本上,它告诉链接器许多翻译单元可以看到该定义,因此它不应该在多个翻译单元上找到它。

一些编译器可能会将其视为内联函数的提示,但这完全取决于编译器,并且完全可以忽略该提示。

标头保护仅防止同一翻译单元上的多个定义。它们不适用于翻译单元。

于 2012-07-16T15:57:06.180 回答
8

标头保护不能防止多个定义错误。

链接器会遇到多个定义,并且当相同的定义包含在单独的编译单元中时会发生。

于 2012-07-16T15:56:55.030 回答