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
无效。
如果你真的需要只读内存中的变量,那么const
和constexpr
都没有什么不同。我只希望平凡的类型能够可靠地放在只读内存中,而 std::string
肯定不是平凡的类型。 ("Trivial type" 是一个技术术语。)
我们正在将我们的一些代码从 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
无效。
如果你真的需要只读内存中的变量,那么const
和constexpr
都没有什么不同。我只希望平凡的类型能够可靠地放在只读内存中,而 std::string
肯定不是平凡的类型。 ("Trivial type" 是一个技术术语。)