【问题标题】:Does using constexpr have diminishing returns?使用 constexpr 的收益是否会递减?
【发布时间】:2015-02-16 16:35:53
【问题描述】:

假设我有一个这样的 constexpr int:

constexpr int i = 42;

但是到目前为止,我的程序没有任何情况可以在编译时使用i,所以它相当没用。但是以后,如果我想在编译时上下文中使用i,我不必回溯并添加constexpr。这可以像 const 正确性一样,您将 const 放在正确的位置并“第一次正确”得到它吗?或者只是没有必要?将所有内容都设为 constexpr 有哪些负面缺点?

【问题讨论】:

  • 嗯,它也是const,所以你不能写i = 43;你不希望你所有的程序变量都是const,是吗?
  • 如果您不想修改将其标记为 constexpr 的值,则会强制执行该行为,同时还可以为您提供使用 as 和数组大小以及其他编译时使用的好处。

标签: c++ c++11 constexpr


【解决方案1】:

将事物标记为constexpr 的唯一缺点与首先使用constexpr 的缺点相同。

我想到的两个最大的缺点是你失去了编译器的可移植性(VC++ 在支持constexpr 方面已经很晚了)并且你不能在constexpr 中使用“非平凡”的对象,例如std::string,即使您可以将它们设为const

除此之外,除了代码大小之外,在代码中使用constexpr 并没有特别的惩罚。如果您认为使用 constexpr 限定的命名常量可能有用,请继续。这是比使用预处理器常量更好的方法。

【讨论】:

  • MSVC 19.00.22310.1(即版本 13.0)编译 constexpr 就好了。
  • 我明白了,当时 MSDN 文档比较滞后。根据msdn.microsoft.com/en-us/library/hh567368.aspx constexpr 仍未实现。
  • 嗯,MSDN 文档是 20 多年来一直设法获得可执行文件入口点的文档,但这是错误的。也就是说,您正在查看 VS 2013 文档,而我提到的编译器随 VS 2015 一起提供。请看这里:blogs.msdn.com/b/vcblog/archive/2014/11/17/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 2020-11-20
  • 2011-05-14
  • 2013-09-28
  • 2020-02-12
  • 2015-04-29
相关资源
最近更新 更多