循环中局部变量的性能:GCC/Clang是否会优化无辅助变量的代码?
GCC/Clang对两段代码的优化情况
会的,GCC和Clang这类主流优化编译器在开启-O1及以上优化级别时,会把这两段代码优化成完全相同的机器指令,性能毫无差异。
核心原因
这两段代码的语义完全等价:都是循环遍历数组前10个元素并打印。编译器的值传播和冗余消除优化会自动识别到:临时变量helper_variable只是array[i]的无副作用拷贝,完全可以直接替换为原数组元素的引用,最终生成的汇编代码和没有临时变量的版本完全一致。
无优化场景的差异
如果关闭优化(默认-O0),编译器可能会给helper_variable分配栈空间,多一次栈上的读写操作,但这种差异几乎可以忽略——整个循环的性能瓶颈其实是printf的IO操作,IO的开销远大于栈变量的读写成本。
两段代码对比
未声明额外局部变量的代码:
void loop (int* array) { for (int i = 0; i < 10; i++) { printf("%i", array[i]); } }
含栈上额外局部变量的代码:
void loop (int* array) { for (int i = 0; i < 10; i++) { int helper_variable = array[i]; printf("%i", helper_variable); } }
内容的提问来源于stack exchange,提问作者theotechnic
相关产品推荐
相关产品推荐

