const static 字段在评估后是否从 AST 中删除? (优化)

Are const static fields removed from the AST once they're evaluated? (optimisation)

在 for 循环中,例如:

for(int i = 0; i < 10000; i ++) {
    const static int test = i;
    ...
}

因为 test 只能分配一次(常量)并且它不会存储在堆栈中(静态)是否是编译器优化以完全删除 const static int test = i; 的 AST for 循环块,以减少运行时缓存未命中的可能性,因为 for 循环主体中存储的子项较少?如果不是,为什么?

我在这背后的思考过程是,一旦 test 被评估,test 的进一步评估将被忽略,因为它是 const static。因此不再需要 test 的 AST。

(对于这个答案,我假设代码是用 C++ 或任何相关语义与 C++ 相同的语言编写的。)

编译器优化通常不在 AST 级别执行,但通常在 IR 级别执行(例如,在 clang 中,大多数优化在 LLVM 级别执行,包括消除不必要的变量)。

但是,是的,优化编译器生成与直接使用 0 而不是 test 的代码相同的代码是合法的(事实上很常见)。如果您删除 const 关键字(只要您实际上没有在任何地方重新分配 test),情况也是如此。

如果您还删除 static 关键字,那么优化编译器几乎肯定会生成与您在使用 test 的所有地方都使用 i 相同的代码(假设值itest 的声明和 test 的任何使用之间永远不会改变。

通常,如果不改变程序的可观察行为(或者仅在根据语言规则未定义行为的情况下才改变程序),任何优化都是合法的。

in order to decrease the chance of cache misses during runtime, as less children are stored in the for loop's body

这好像是对代码的编译和执行方式有点误解。编译后的代码运行时AST已经不存在了,所以编译时AST有多少children对程序的运行时间没有直接影响[=21] =]

重要的是访问内存的频率以及访问的位置是否彼此靠近。所以当变量不能被优化掉时,编译器会尽量将它们保存在寄存器中。根本不访问内存就不会错过缓存