考虑头文件:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
或者,或者:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
在预模块世界中,这些标头可能以文本形式包含在多个 TU 中,而不会违反 ODR。此外,由于涉及的成员函数相对较小,编译器可能会“内联”(使用时避免函数调用)这些函数,甚至优化掉一些实例T
。
在最近关于完成 C++20 的会议的报告中,我可以阅读以下声明:
我们澄清了
inline
模块接口的含义:意图是没有显式声明的函数体不是inline
模块 ABI 的一部分,即使这些函数体出现在模块接口中。为了让模块作者对他们的 ABI 有更多的控制,模块接口中类体中定义的成员函数不再是隐式inline
的。
我不确定我没有弄错。这是否意味着,在模块世界中,为了让编译器能够优化函数调用,我们必须对它们进行注释,inline
即使它们是在类中定义的?
如果是这样,下面的模块接口是否等同于上面的标题?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
尽管我仍然没有支持模块的编译器,但我想inline
在适当的时候开始使用这样的方法,以尽量减少未来的重构。