C++ 编译器优化 - 为啥需要 constexpr?

Posted

技术标签:

【中文标题】C++ 编译器优化 - 为啥需要 constexpr?【英文标题】:C++ Compiler Optimization - Why is constexpr Needed?C++ 编译器优化 - 为什么需要 constexpr? 【发布时间】:2019-01-07 04:38:54 【问题描述】:

我想知道为什么编译器没有优化 constexpr 的好处?

编译器应该能够推断出一个值在编译时比人类更好(例如,如果函数调用的所有输入都是已知的),然后它应该能够将该值标记为已知后续分析,直到变得模棱两可。那么为什么在这种情况下我们必须手动告诉编译器(而不是只使用 const 关键字并将其留给编译器在编译时评估值)。

这是因为编译器技术还不能做到这一点,还是有某种固有的限制阻止了编译器这样做?

【问题讨论】:

已知函数调用的所有输入并不能保证相同函数的其他调用传递在运行时确定的值。编译器会根据你告诉它的内容生成代码。 constexpr 未添加以促进优化。编译器不必基于它进行优化(即使它可以并且确实如此)。 @SidS 我没有说所有函数调用都将被视为已知值。我举了一个例子来说明这应该是一个相当简单的优化问题,编译器可以识别编译时已知的所有值并评估它们,其中包括所有 constexpr 变量,从而使它们无法作为优化措施。 @StoryTeller 谢谢!这清除了它,因为我认为它是。 @pooya13, 编译器必须根据它拥有的信息生成代码。如果它不知道函数的所有调用都将具有编译时常量参数,那么它如何生成做出该假设的代码?这就是你告诉它的原因 - 有效地防止调用传递运行时生成的值。 【参考方案1】:

如果您省略 constexpr,编译器很可能仍然能够在编译时计算该值。

主要思想是,您可以告诉编译器您希望在编译时评估某些东西,以便编译器在您犯错时发出错误并使用它无法在编译时评估的东西。

它显然还允许在只允许使用编译时常量(如数组大小)的地方使用值。

【讨论】:

以上是关于C++ 编译器优化 - 为啥需要 constexpr?的主要内容,如果未能解决你的问题,请参考以下文章

为啥编译器可以比普通函数更好地优化 lambda?

C++中debug和release的区别? 为啥debug没问题的程序release之后就出问题了?

为啥支持 C++11 及更高版本的 C++ 编译器需要 Boost.SmartPtr?

为啥 C++ 构造函数在继承中需要默认参数?

C++:为啥会编译? (将 this-Reference 交给基类)

为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?