从我很久以前在某处读到的内容看来,如果您希望在编译阶段内联类成员函数,则必须在类声明块中定义该函数。
但这有一个细节泄漏的缺点。恕我直言,其他程序员在打开 .h 文件时应该只看到类接口。
第一个陈述在现代 C++ 中是否仍然正确,曾经是这样吗?有没有办法强制内联声明的函数,最好是在另一个文件中?
在类声明块中保留简短的成员函数通常更好吗?
似乎如果您希望在编译阶段内联类成员函数,则必须在类声明块中定义该函数。
这不是真的。在类定义中定义的函数被隐式标记为. 但是您不需要在类中定义函数,您可以显式请求它:inline
inline
struct X {
void f();
};
inline void f() {}
inline
另一方面,关键字并不意味着该函数将被内联,而是它可以在多个翻译单元中定义,即如果多个翻译单元包含包含该定义的同一个标头,则链接器不会失败有多重定义错误。
现在,在实际内联时,编译器可以决定内联或不内联任何函数,无论该函数是否被声明为inline
提供它看到该函数的定义(它将内联的代码),这就是一般的原因应该内联的函数应该在标题中定义(在类定义内部或inline
在外部标记。
此外,较新的工具链可以执行整个程序优化或其他链接时间优化,链接器也可以通过这些优化来决定应该内联函数。在这种情况下,函数定义不需要在调用站点可见,因此可以在 .cpp 文件中定义。但是如果你真的想要内联函数,最好不要依赖这个特性,而只是在标题中定义函数。
问:有没有办法强制内联函数?
答:没有
无论您如何将函数指定为内联,它都是允许编译器忽略的请求:它可能内联扩展对内联函数的一些、全部或不调用。
问:C++ 类中的内联规则是什么?
就标准 C++ 而言,内联函数必须在使用它的每个翻译单元中定义......
这与必须在整个程序中只定义一次的非内联函数不同(一个定义规则)......
对于成员函数,如果你在类中定义你的函数,它是隐式内联的。由于它出现在标题中,因此必须在使用它的每个翻译单元中定义它的规则会自动得到满足。
这是一个很棒的常见问题解答(比“迂腐”更“实用”):
第一个陈述在现代 C++ 中是否仍然正确,曾经是这样吗?
正如大卫解释的那样,还有 inline 关键字。正如保罗所说,它可以忽略不计。
有没有办法强制内联声明的函数,最好是在另一个文件中?
可能是通过配置你的编译器。无论如何,它可能会在你背后做一些事情。例如。gcc-finline-functions
等将针对某些优化级别打开
在类声明块中保留简短的成员函数通常更好还是没有?
由你决定。请注意,如果您多次使用内联方法,那么您可能会增加目标文件的大小,因此可能会增加您正在构建的内容的大小,并且可能会减慢它的速度。
FWIW我只倾向于将实现放在头文件中出于懒惰:)