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

What are the inlining rules within C++ classes?

本文关键字:规则 是什么 C++      更新时间:2023-10-16

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

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

在现代C++中,第一种说法是否仍然正确,是否曾经如此?有没有办法强制内联声明的函数,最好是在另一个文件中?

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

似乎如果您希望在编译阶段内联类成员函数,则必须在类声明块中定义该函数。

事实并非如此。在类定义定义的函数隐式标记为 inline 。但是你不需要在类内部定义函数就可以inline,你可以显式请求它:

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

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

现在,在实际联时,编译器可以决定内联或不内联任何函数,无论该函数是否声明为 inline 只要它看到该函数的定义(它将内联的代码),这就是为什么在一般情况下应该在标头中定义要内联的函数的原因(在类定义内部或标记为外部inline

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

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

答:否

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

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

C++中的内联成员函数

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

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

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

这里有一个很棒的常见问题解答(一个比"迂腐"更"实用"的常见问题解答):

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

在现代C++中,第一种说法仍然正确吗?

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

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

可能通过配置编译器。 无论如何,它可能在背后做一些内窥。 例如。GCC 有 -finline-functions 等,这些 等将针对某些优化级别打开

将短成员函数保留在类声明块中通常更好还是不更好?

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

FWIW 出于懒惰,我只倾向于将实现放在头文件中:)