内联静态 constexpr 与全局内联 constexpr
inline static constexpr vs global inline constexpr
假设我在头文件中有几个 inline constexpr
变量(命名为 default_y
和 default_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 static
和 static
构建了一次程序,与之前的解决方案相比,二进制文件的大小没有差异,所以链接器可能生成了完全相同的代码(希望)。
放置static inline constexpr
变量不应以任何方式影响效率。由于 constexpr
如果可能的话,它们在编译时是 const-initialized。 inline
关键字可帮助您在 class
的主体内初始化 static
变量。您可能会发现 inline
关键字上的 material 很有趣:https://pabloariasal.github.io/2019/02/28/cpp-inlining/
假设我在头文件中有几个 inline constexpr
变量(命名为 default_y
和 default_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 static
和 static
构建了一次程序,与之前的解决方案相比,二进制文件的大小没有差异,所以链接器可能生成了完全相同的代码(希望)。
放置static inline constexpr
变量不应以任何方式影响效率。由于 constexpr
如果可能的话,它们在编译时是 const-initialized。 inline
关键字可帮助您在 class
的主体内初始化 static
变量。您可能会发现 inline
关键字上的 material 很有趣:https://pabloariasal.github.io/2019/02/28/cpp-inlining/