我们正在将一些代码从c ++ 03迁移到c ++ 14,并且只要有一些性能提升,我们就想使用c ++ 14特性。现在我们的一个项目中我们正在根据列解析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变量也放在只读内存中,这种努力是不值得的?
答案 0 :(得分:7)
使用constexpr
没有任何好处,除非您可以在某些无法评估非constexpr
表达式的上下文中评估表达式。
您应该坚持使用const
,除非您有constexpr
的具体原因并且const
不起作用。
如果您确实需要只读内存中的变量,那么const
和constexpr
都不会有任何不同。我只希望普通类型能够可靠地放在只读内存中,std::string
肯定不是一个简单的类型。 (“琐碎型”是一个技术术语。)
答案 1 :(得分:2)
不,我不希望有任何性能提升。
C ++语言未指定constexpr
个对象/方法数量的最大限制。任何限制都将由您的编译器和/或操作系统强加。
C ++语言没有指定编译器是否将const
变量放入“#read; memory read"”中。确实,现代操作系统具有复杂的虚拟内存和地址空间实现,并为应用程序提供了指定具有不同属性的虚拟地址空间的不同区域,例如读/写和只读,现代C ++编译器充分利用操作系统的资源,并将指定为只读的对象放在一个单独的内存段中,以实现最佳的虚拟内存性能。