Compiler construction 常量静态字段一旦';重新评估?(优化)

Compiler construction 常量静态字段一旦';重新评估?(优化),compiler-construction,compiler-optimization,Compiler Construction,Compiler Optimization,在for循环中,例如: for(int i = 0; i < 10000; i ++) { const static int test = i; ... } for(int i=0;i。< /P> < P>(对于这个答案,我假定代码是用C++编写的,或者任何与C++相关的语义相同的语言)< /P> 编译器优化通常不是在AST级别执行的,而是在IR级别执行的(例如,在clang中,大多数优化是在LLVM级别执行的,这包括消除不必要的变量) 但是是的,优化编译器生成相同的代码

在for循环中,例如:

for(int i = 0; i < 10000; i ++) {
    const static int test = i;
    ...
}
for(int i=0;i<10000;i++){
常数静态int测试=i;
...
}
由于
test
只能分配给一次(const),并且它不会存储在堆栈(static)中,因此完全删除
const static int test=i的AST是一种编译器优化来自for循环块,以减少运行时缓存未命中的机会,因为for循环体中存储的子对象较少?如果不是,为什么

我的思考过程是,一旦
test
被评估,对
test
的进一步评估就会被忽略,因为它是
const static
。因此,不再需要<代码>测试< /代码>。< /P> < P>(对于这个答案,我假定代码是用C++编写的,或者任何与C++相关的语义相同的语言)< /P> 编译器优化通常不是在AST级别执行的,而是在IR级别执行的(例如,在clang中,大多数优化是在LLVM级别执行的,这包括消除不必要的变量)

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

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

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

为了减少运行时缓存未命中的机会,因为for循环体中存储的子对象较少

这似乎有点误解了代码是如何编译和执行的。运行编译后的代码时,AST不再存在,因此编译期间AST中有多少子级对程序的运行时没有直接影响

重要的是访问内存的频率以及访问的位置是否彼此相邻。因此,当变量无法优化时,编译器将尽可能多地将它们保存在寄存器中。当你根本不访问内存时,你不能错过缓存。< /P> < P>(对于这个答案,我假设代码是用C++编写的,或者是任何与C++相关的语义相同的语言)< /P> 编译器优化通常不是在AST级别执行的,而是在IR级别执行的(例如,在clang中,大多数优化是在LLVM级别执行的,这包括消除不必要的变量)

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

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

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

为了减少运行时缓存未命中的机会,因为for循环体中存储的子对象较少

这似乎有点误解了代码是如何编译和执行的。运行编译后的代码时,AST不再存在,因此编译期间AST中有多少子级对程序的运行时没有直接影响


重要的是访问内存的频率以及访问的位置是否彼此相邻。因此,当变量无法优化时,编译器将尽可能多地将它们保存在寄存器中。当您根本不访问内存时,您不会错过缓存。

您是想优化编译代码所需的时间,还是想优化运行编译代码所需的时间?通常编译器优化只关注后者(事实上,如果你想优化前者,最好不要执行任何优化,因为优化需要时间)。是的,我的意思是优化运行代码所花费的时间,你是在问优化编译代码的时间还是优化运行编译代码的时间?通常编译器优化只关注后者(事实上,如果你想优化前者,最好不要执行任何优化,因为优化需要时间)。是的,我的意思是优化运行代码所花费的时间,而不是编译代码。在C中,这段代码是非法的,不是吗?可以是C++,其静态变量初始化的语义是完全不同的。@ RICI确实是,很好的捕捉。我把它改成了“C++”。我的错,应该澄清一下-是的,它是C++中的C++这段代码是非法的,不是吗?可以是C++,其静态变量初始化的语义是完全不同的。@ RICI确实是,很好的捕捉。我把它改成“C++”了。我的坏,应该已经澄清了——是的,C++。