constexpr class 成员的优缺点
Pros and cons of constexpr class members
比较这两种方法:
// MyClass.hpp
class MyClass
{
static constexpr char* const FOO = "bar";
};
对比
// MyClass.hpp
class MyClass
{
static const char* const FOO;
};
// MyClass.cpp
const char* const MyClass::FOO = "bar";
哪个更好?我想在第二种情况下,"bar" 字符串只分配一次,而在第一种情况下,每个包含我的 header 的 .cpp 都会分配一次。我对么?还有其他要考虑的地方吗?
第一个版本仅在 c++17
之后才有可能。它之所以有效,是因为所有声明为 constexpr
的静态成员变量都隐含地 inline.
允许多个定义(在单独的编译单元中)但是当链接时只有 1 个。所以你假设它在每个 .cpp
文件中分配一次是不正确的。
哪一个更可取取决于。如果我知道我永远不会改变它,或者很少改变它,我会选择第一个选项。
如果我需要更改它,它可能会导致 #include
它的所有 .cpp
个文件必须重新编译,然后最好将它分开在 .cpp
文件。
比较这两种方法:
// MyClass.hpp
class MyClass
{
static constexpr char* const FOO = "bar";
};
对比
// MyClass.hpp
class MyClass
{
static const char* const FOO;
};
// MyClass.cpp
const char* const MyClass::FOO = "bar";
哪个更好?我想在第二种情况下,"bar" 字符串只分配一次,而在第一种情况下,每个包含我的 header 的 .cpp 都会分配一次。我对么?还有其他要考虑的地方吗?
第一个版本仅在 c++17
之后才有可能。它之所以有效,是因为所有声明为 constexpr
的静态成员变量都隐含地 inline.
允许多个定义(在单独的编译单元中)但是当链接时只有 1 个。所以你假设它在每个 .cpp
文件中分配一次是不正确的。
哪一个更可取取决于。如果我知道我永远不会改变它,或者很少改变它,我会选择第一个选项。
如果我需要更改它,它可能会导致 #include
它的所有 .cpp
个文件必须重新编译,然后最好将它分开在 .cpp
文件。