内联静态 constexpr 与全局内联 constexpr

inline static constexpr vs global inline constexpr

假设我在头文件中有几个 inline constexpr 变量(命名为 default_ydefault_x),我决定将它们移动到 class它们完全相关并标记它们static(因为它在设计方面似乎更好)。

namespace Foo
{

inline constexpr std::streamsize default_size { 160 }; // not closely related to the class Bar

class Bar
{
public:
    inline static constexpr std::uint32_t default_y { 20 }; // closely related to the class Bar
    inline static constexpr std::uint32_t default_x { 20 }; // closely related to the class Bar
};

}

所以问题是,这会在程序开始时初始化它们的方式和时间(以及整体效率)方面产生影响吗?这个特定用例中的 inline 关键字是否会强制编译器为这两个变量添加一些保护措施并降低访问它们的速度?或者可能因为它们是 constexpr,所以不需要在运行时做这些事情,因为它们的值可以从可执行文件的只读部分检索,然后在 [=25] 开始时分配给它们=]main线程?

我用 inline staticstatic 构建了一次程序,与之前的解决方案相比,二进制文件的大小没有差异,所以链接器可能生成了完全相同的代码(希望)。

放置static inline constexpr变量不应以任何方式影响效率。由于 constexpr 如果可能的话,它们在编译时是 const-initialized。 inline 关键字可帮助您在 class 的主体内初始化 static 变量。您可能会发现 inline 关键字上的 material 很有趣:https://pabloariasal.github.io/2019/02/28/cpp-inlining/