在头文件中定义全局 static const std::string 是否正确

Ami*_*nos 2 c++

在头文件中定义全局 std::string 是否正确,如下所示:

namespace Colors
{
    static const std::string s_blue = "Blue";
}
Run Code Online (Sandbox Code Playgroud)

bol*_*lov 5

正确的?

是的。static这里意味着包含此标头的每个翻译单元 (TU) 将有一个唯一的对象。s_blue因此,整个项目没有 1 个对象,而是每个 TU 都有一个对象。

然而,由于const所有对象都是平等的,所以对于用户来说这没有什么区别。

受到推崇的?

也许吧,要看情况。

最大的缺点是您创建了多个对象,并且所有对象都在程序启动时初始化。

另一个可能的缺点是访问模式。如果程序s_blue快速连续地从多个 TU 进行评估,则可能会破坏缓存。

然而,对于某些程序和场景,这可能是最好的选择,或者至少“足够好”。例如(下一段的剧透)在纯头文件库中或 C++17 之前。

有更好的选择吗?

是的,但它们不能总是被使用。

extern

将其extern作为标头中的声明,并在 1 个 TU 中进行定义。

// constants.hpp
extern const std::string k_blue;

// constants.cpp
#include "constants.hpp"
const std::string k_blue = "Blue";
Run Code Online (Sandbox Code Playgroud)

这在性能方面明显优于 OP。但是,您不能在仅标头的库中使用它。

即使在正常的程序中也static可能是首选,因为在一个地方声明和定义常量的简便性可以被视为超过了特定项目中的性能下降。

constexpr inline string_viewC++17

如果可用(自 C++17 起),显然更好的替代方案是string_view. 它的重量非常轻,但具有现代容器的所有便利设施(与 raw 不同const char[])。既然你已经使用了 C++17,你应该这样做constexpr inline

constexpr inline std::string_view k_blue = "Blue";
Run Code Online (Sandbox Code Playgroud)

inline const std::string时间:2017-12-17 标签:c++17

如果出于某种原因您需要std::string超过std::string_view您可以内联变量以获得更好的优化:

inline const std::string k_blue = "Blue";
Run Code Online (Sandbox Code Playgroud)