编译器是如何实现constexpr函数的?

6

我最近在考虑这个问题。像gcc这样的编译器如何在编译时评估constexpr函数调用?

最方便的方式似乎是使用函数的编译后机器码或更可能的是一些编译后的中间代码并执行它,但这有一些问题。在2020标准中允许在constexpr函数中进行动态分配。如果一个constexpr函数有一些错误编写的内存管理代码,比如试图double-free一个指针怎么办?如果编译器在这种情况下崩溃会更好。如果它破坏堆栈并在编译器进程的其他位置覆盖数据呢?同样地,如果编译器不崩溃会更好。编译器是否在沙箱环境中执行它?它如何检测这样的内存错误?如果发生这样的内存错误,它会怎么做?编译器是否以其他方式模拟函数?谢谢。


2
这是一个有趣的问题,但是太过宽泛了。即使你只问一个实现,我认为也太宽泛了。 - cigien
编译器确实需要检查越界访问和其他未定义行为。 - Jarod42
你的“最方便的方法”对于交叉编译器也不适用。 - Nate Eldredge
我认为如果您询问一个具体的例子而不是任何一般函数,那么您的问题可能更合适。此外,如果您更接近一个问题进行提问。现在您正在问7个问题,这意味着回答变得非常困难,因为它必须涵盖所有7个才能成为适当的答案。 - Ted Klein Bergman
虽然这是一个广泛的问题,但我认为一个广泛的答案是可以接受的。编译器解释代码时可以访问比编译后的代码更多的信息(例如数组长度、对象生命周期等)。我认为符号执行发挥了重要作用。 - alter_igel
@alterigel “广泛”的一个好代替词是“长度”。我猜想任何合理回答这个问题的答案都需要至少几页的文字。如果你觉得你可以简要回答,那就去做吧,我没有意见。 - cigien
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接