constexpr 字符串与 const 字符串

constexpr string vs const string

我们正在将我们的一些代码从 c++03 迁移到 c++14,只要有一些性能提升,我们就想在我们正在解析的一个项目中使用 c++14 features.Now基于列名的 csv,这些列名在一个头文件中声明如下:

const string ITEM_NAME = "Item Name";
const string ITEM_ID = "Item Id";

有数百个这样的常量,所以我想知道的是,如果我将上面的代码更改为这样的内容,是否会有显着的性能提升:

constexpr string ITEM_NAME = "Item Name";
constexpr string ITEM_ID = "Item Id";

另外,我们的二进制文件中的 constexpr 数量是否有任何限制,因为它们需要存储在只读内存中?

编译器是否也自动优化旧的 c++03 代码并将 const 变量也放在只读内存中,这种努力不值得吗?

不,我不希望有任何性能提升。

C++ 语言没有规定 constexpr objects/methods 的最大数量限制。您的编译器 and/or 操作系统会施加任何限制。

C++ 语言也没有指定编译器是否将 const 变量放入所谓的 "read only memory" 中。现代操作系统确实对虚拟内存和地址 space 进行了复杂的实现,并允许应用程序指定具有不同属性的虚拟地址 space 的不同区域,例如 read/write 和 read/only,而现代C++编译器充分利用了操作系统的资源,会将指定为只读的对象放置在单独的内存段中,以达到最佳的虚拟内存性能。

使用 constexpr 没有任何优势,只是允许您在某些无法计算非 constexpr 表达式的上下文中计算表达式。

你应该坚持使用 const 除非你有特定的原因 constexpr 有效而 const 无效。

如果你真的需要只读内存中的变量,那么constconstexpr都没有什么不同。我只希望平凡的类型能够可靠地放在只读内存中,而 std::string 肯定不是平凡的类型。 ("Trivial type" 是一个技术术语。)