1

C++ ISO 标准说:

"A function defined within a class definition is an inline function."

有没有忽略这条规则的编译器?
(请不要将 inline 误认为 inlineD - 我的问题是如果有一个编译器,它不会把它应该的内联建议放在那里)

4

5 回答 5

8

您似乎误解了“内联”的含义。这并不意味着函数会自动内联;根据 7.1.2-2,它表明内联替换是首选。

因此,您无法从代码中判断一个函数是否被标记为内联,因为编译器可以自由决定一种或另一种方式。这只是一个编译器提示。

于 2009-03-17T14:28:02.257 回答
5

该标准规定所有编译器都可以忽略内联请求,无论是隐式的还是显式的。他们是否这样做通常取决于函数是否可以实际内联 - 例如递归函数不能。

编辑:只是为了澄清-提问者忽略了这一点,从标准中的前一段到他引用的内容:

在调用点执行此内联替换不需要实现

于 2009-03-17T14:25:58.877 回答
4

我怀疑你的测试有缺陷。你不能只用一个这样的文件来测试编译器是否忽略了内联说明符。

您需要包含包含内联函数定义的标头,并将其包含到多个实现文件中,然后将它们链接在一起。如果您收到有关该函数的多个已定义实例的链接器错误,则编译器忽略有关其最重要属性的内联说明符:允许在整个程序中多次定义它,同时仍为其保留相同的地址及其本地静态变量。

您的测试可能检查的是编译器是否内联对函数的调用,这实际上只是对编译器的提示,并且只是内联说明符的许多其他更重要后果的一小部分。如果编译器没有内联对该函数的调用,则可以这样做。该标准不要求它在这件事上做任何事情。

于 2009-03-17T14:47:51.083 回答
2

请参阅我对一个非常相似的问题的回答:“内联”何时无效?(在 C 中)

总结:内联只需要允许多个定义。任何调用更改的函数都是完全可选的。

于 2009-03-17T16:25:26.060 回答
0

编译器的内联通常基于函数的调用次数、函数中伪指令的数量以及一堆其他的东西。查看有关优化选项的 GCC 文档,了解它是如何工作的。基本上,inline关键字只是增加编译器内联可能性的提示。内联的实际决定通常很复杂。

于 2009-03-17T14:43:51.500 回答