从我很久以前读到的内容看来,如果你想在编译阶段内联类成员函数,那么必须在类声明块中定义函数。
但这有一个细节泄漏的缺点。恕我直言,其他程序员在打开.h文件时应该只看到类接口。
现代C ++中的第一个陈述是否仍然如此,是吗?有没有办法强制内联声明的函数,最好是在另一个文件中?
在类声明块中保留短成员函数通常更好吗?
答案 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 ++而言,必须定义内联函数 在每个使用它的翻译单元中 ...
这与必须仅定义的非内联函数不同 一次在整个程序中(单一定义规则)......
对于成员函数,如果在类中定义函数,则为 隐式内联。并且因为它出现在标题中,所以规则 它必须在使用它的每个翻译单元中定义 自动满足。
这是一个很棒的常见问题解答(一个比“迂腐”更“实用”):
答案 2 :(得分:0)
在现代C ++中,第一个陈述是否仍然如此,是吗?
正如大卫解释的那样,也有内联关键字。正如保罗所说,它可以被忽略。
有没有办法强制内联声明的函数, 最好是在另一个文件中?
可能通过配置编译器。无论如何,它可能会在你背后做一些事情。例如。 gcc有-finline-functions
等等,将在某些优化级别打开
将短成员函数保留在类声明块中通常更好吗?或者没有?
由你决定。请注意,如果您使用内联方法很多次,那么您可能会增加目标文件的大小,因此可能会增加您正在构建的内容的大小,并可能减慢它的速度。
FWIW我只倾向于将头文件中的实现放在懒惰之外:)