C编译器(GCC/Clang/rustc)是否会优化循环中的内存解引用?
关于C编译器循环边界优化的问题
给定如下C结构体定义:
struct GayClub { ... int ndrinks; ... };
以及对应的循环代码:
// my struct struct GayClub gc; //.... // my loop int i = 0; for (; i < gc.ndrinks; ) { ... // 循环内不会修改 gc.ndrinks 的值 ... i++; }
已知循环内部不会修改gc.ndrinks的值,请问GCC、Clang这类C编译器是否会自动将其优化为以下形式——把循环边界提取到临时变量,避免每次循环都从内存中解引用:
// trick int tmpNDrinks = gc.ndrinks; // my za-loop-a for (; i < tmpNDrinks; ) { ... // no modifications on gc.ndrinks ... i++; }
如果编译器能自动完成该优化,就不需要手动提取循环边界为单独变量。
GCC、Clang这类主流C编译器会自动完成这个优化。
这类优化属于编译器的数据流分析范畴:编译器会扫描整个循环体代码,确认gc.ndrinks的值在循环过程中没有被修改,也不存在其他可能导致其内存值变化的操作(比如无其他线程修改、无指针间接修改等前提),就会提前将gc.ndrinks的值读取到寄存器或局部临时变量中,避免每次循环条件判断时都去内存中读取该值,以此提升循环执行效率。
需要注意的是,rustc是Rust语言的编译器,并非C编译器,但针对Rust代码的类似场景,它也会做出等价的优化。
内容的提问来源于stack exchange,提问作者Caspian Power
相关产品推荐
相关产品推荐

