我最近一直在想这件事。像gcc这样的编译器如何在编译时实现对constexpr函数调用的求值?
最方便的方法似乎是使用函数的编译后的机器码或更可能的一些编译后的中间代码来执行它,但这有一些问题。在2020年的标准中,constexpr函数允许动态分配。如果一个constexpr函数有一些不正确的内存管理代码,并试图双重释放一个指针,那该怎么办?如果编译器在这种情况下没有崩溃就更好了。如果它破坏了堆栈,并覆盖了编译器进程中其他地方的数据,该怎么办?类似地,如果编译器没有崩溃就更好了。编译器会在沙箱环境中执行它吗?它如何检测这样的内存错误?如果发生这样的内存错误,它会做什么?编译器是否会以其他方式模拟该函数?谢谢。
发布于 2020-11-27 06:49:46
基本上,他们通过使用一个特殊的常量表达式解释器来计算常量表达式。
在这里你可以阅读/观看clangs的实现
这对于一个简单的答案来说太多了。
https://stackoverflow.com/questions/65029891
复制相似问题