是否存在关于默认内联函数的IGNORE C ++标准的编译器?

时间:2009-03-17 14:19:41

标签: c++ inline standards-compliance

C ++ ISO标准说:

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

是否存在IGNORE此规则的任何编译器? (请不要错误内联inlineD - 我的问题是,如果有一个编译器,那不会在那里提出内联建议它应该)

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

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

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

  

不需要实施   执行此内联替换   通话点

答案 2 :(得分:4)

我怀疑你的测试存在缺陷。您无法仅使用一个此类文件进行测试,无论编译器是否忽略内联说明符。

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

您的测试可能检查的是编译器是否内联函数调用,这实际上只是对编译器的一个提示,而且只是内联说明符的许多其他更重要的后果。如果编译器没有内联对该函数的调用,那么这样做很好。该标准不要求它在这个问题上做任何事情。

答案 3 :(得分:2)

请参阅我对一个非常相似问题的回答:When is "inline" ineffective? (in C)

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

答案 4 :(得分:0)

编译器通常基于对函数的调用次数,函数中伪指令的数量以及一堆其他内容进行内联。看看GCC documentation on optimization options,了解它是如何做到的。基本上,inline关键字只是提示编译器内联的可能性。内联的实际决定通常很复杂。