4

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

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

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

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

4

3 回答 3

7

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

这不是真的。在类定义中定义的函数被隐式标记为. 但是您不需要在类中定义函数,您可以显式请求它:inlineinline

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

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

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

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

于 2012-06-03T01:40:21.773 回答
2

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

答:没有

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

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

C++ 中的内联成员函数

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

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

对于成员函数,如果你在类中定义你的函数,它是隐式内联的。由于它出现在标题中,因此必须在使用它的每个翻译单元中定义它的规则会自动得到满足。

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

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

于 2012-06-03T01:36:21.260 回答
0

第一个陈述在现代 C++ 中是否仍然正确,曾经是这样吗?

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

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

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

在类声明块中保留简短的成员函数通常更好还是没有?

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

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

于 2012-06-03T01:59:31.247 回答