【发布时间】:2019-02-04 07:40:43
【问题描述】:
有没有一种标准方法可以找出编译器对constexpr 函数做了什么?
(旁注:对于调试,默认情况下,每个 constexpr 函数都推迟到运行时。为什么这是明智的?有没有办法影响这一点?)
对于发布它取决于上下文。显然,对于小型测试设置,您可以轻松检查生成的机器代码,但这不是真正项目的方式。
我当前的“解决方法”(VC++)是在某个地方中断,转到我的 constexpr 函数并(尝试)检查反汇编。如果没有,我的结论是这一切都是在编译时完成的。 但这种方式并不是 100% 可靠的。 (优化等) 只有反过来是肯定的:如果我确实找到了反汇编(甚至可以在那里中断),我知道它不是在编译时完成的。
【问题讨论】:
-
这是一个更好的问题:为什么需要?让编译器完成它的工作并优化它认为合适的地方。
constexpr不是优化工具;它是一种工具,可让您在以前无法编写的地方编写代码。编写在需要常量表达式的上下文中生成常量表达式的代码。 -
好吧,你可以试试强制,见“constexpr does not work/apply inside function call”。但最后,没有相当的方法来强制它,只是让大多数编译器不要这样做太复杂。除了运行时和评估编译的 cCode 之外,没有办法确定。
-
@Deduplicator 我知道我在不久前看到它,但找不到它。原来是同一个提问者。我想这会让我的答案过时了。
-
@old123987:“所以,是的,这是一种性能优化!”好吧,这不是该功能的用途。就像
inline并不意味着编译器会内联函数一样,constexpr也不保证编译器只会在编译时评估函数。 -
您自己here 似乎有一个几乎重复的问题。请说明您对接受的答案不满意的原因。
标签: c++ c++11 compilation c++17 constexpr