C ++类中的内联规则是什么?

时间:2012-06-03 01:30:19

标签: c++ inline

从我很久以前读到的内容看来,如果你想在编译阶段内联类成员函数,那么必须在类声明块中定义函数。

但这有一个细节泄漏的缺点。恕我直言,其他程序员在打开.h文件时应该只看到类接口。

现代C ++中的第一个陈述是否仍然如此,是吗?有没有办法强制内联声明的函数,最好是在另一个文件中?

在类声明块中保留短成员函数通常更好吗?

3 个答案:

答案 0 :(得分:7)

  

似乎如果你想在编译阶段内联类成员函数,那么必须在类声明块中定义该函数。

这不是真的。在类定义定义的函数隐式标记为inline。但是你不需要在类中定义函数,因为它是inline,你可以明确地请求它:

struct X {
   void f();
};
inline void f() {}

另一方面,inline关键字并不意味着该函数将内联,而是可以在多个翻译单元中定义也就是说,如果多个翻译单元包含包含该定义的相同标头,则链接器不会因多重定义错误而失败。

现在,在实际的内联中,编译器可以决定内联或不内联任何函数,无论函数是否声明为inline,只要它看到定义< / em>该函数(它将内联的代码),这就是为什么通常应该在头文件中定义要内联的函数(在类定义内部或在外部标记inline

此外,较新的工具链可以执行整个程序优化或其他链接时间优化,链接器也可以通过它来决定是否应该内联函数。在这种情况下,函数定义不需要在调用站点可见,因此可以在.cpp文件中定义。但是如果你真的希望函数是 inlined ,最好不要依赖这个功能,只需在头文件中定义函数。

答案 1 :(得分:2)

问:有没有办法强制函数内联?

答:没有

  

无论您如何将函数指定为内联,都是一个请求   允许编译器忽略:它可能内联扩展一些,全部,   或者没有调用内联函数。

问:C ++类中的内联规则是什么?

  

Inline member functions in C++

     

就标准C ++而言,必须定义内联函数   在每个使用它的翻译单元中   ...

     

这与必须仅定义的非内联函数不同   一次在整个程序中(单一定义规则)......

     

对于成员函数,如果在类中定义函数,则为   隐式内联。并且因为它出现在标题中,所以规则   它必须在使用它的每个翻译单元中定义   自动满足。

这是一个很棒的常见问题解答(一个比“迂腐”更“实用”):

http://www.parashift.com/c++-faq-lite/inline-functions.html

答案 2 :(得分:0)

  

在现代C ++中,第一个陈述是否仍然如此,是吗?

正如大卫解释的那样,也有内联关键字。正如保罗所说,它可以被忽略。

  

有没有办法强制内联声明的函数,   最好是在另一个文件中?

可能通过配置编译器。无论如何,它可能会在你背后做一些事情。例如。 gcc有-finline-functions等等,将在某些优化级别打开

  

将短成员函数保留在类声明块中通常更好吗?或者没有?

由你决定。请注意,如果您使用内联方法很多次,那么您可能会增加目标文件的大小,因此可能会增加您正在构建的内容的大小,并可能减慢它的速度。

FWIW我只倾向于将头文件中的实现放在懒惰之外:)