如何解决如果constexpr函数未在编译时运行,该如何调试?
例如,我有一个constexpr函数,但是我使用运行时变量(未标记为constexpr
)来获取返回值。在这种情况下,我不确定该函数是在编译时还是在运行时运行,那么有什么调试方法吗?
起初我考虑过static_assert
,但是看来static_assert
不能做到这一点。然后我想到了将代码转换为汇编代码,但是检查汇编代码以弄清楚的方法太困难了。
解决方法
在C++20
之前,无法从程序本身直接处理它。
有了C++20
,您就有了std::is_constant_evaluated。
如果constexpr函数的返回类型是有效的非类型模板参数,则可以强制在编译时对函数进行求值,如下所示:
constexpr int func( int x )
{
return x*2;
}
template < auto x >
auto force_constexpr_evaluation()
{
return x;
}
int main()
{
int y = force_constexpr_evaluation<func(99)>();
}
如果您已经在使用c++20
,则可以使用consteval
在程序集级别进行调试应该不太困难。
- 如果您看到对constexpr函数的函数调用,则该函数正在运行时运行。
- 如果直接看到转发的值,则会在编译时对其进行评估。
- 如果是内联的,则应该能够通过将功能名称(从调试符号到内联代码的位置)相关联来检测到它。通常,如果在constexpr函数上设置了一个断点,并且并非总是在编译时执行,而是内联的,那么您会得到许多断点,而不仅仅是一个断点。即使是一个,它也指向这种情况下的内联位置。
顺便说一句:无法将端口std::is_constant_evaluated
备份到较早的编译器,因为它需要一些实现魔术。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。