A-A+

如下为一个C语言程序: void main() { int i=0 J=0 k=0; i=1

2022-08-12 20:20:41 问答库 阅读 197 次

问题详情

如下为一个C语言程序: void main() { int i=0,J=0,k=0; i=1; j=2; while(true) { k=i+1; j=J+kj if(j<100)break; } } 在x86的处理器上经过编译优化后生成如下的代码: TITLE E:\Temp\ifelse.cpp .386p include listing.inc PUBLIC main ;COMDAT_main _TEXT SEGMENT _main PROC NEAR COMDAT mov eax,2 试说明编译器对该程序进行了哪些优化。


请帮忙给出正确答案和分析,谢谢!

参考答案

正确答案:编译程序实施了如下的优化措施:(1)删除无用赋值:在while循环之外存在两次对i和j的赋值两次赋值之间并无对i和j的引用因此前一次赋值为无用赋值编译程序将其删除。(2)常量合并与传播:i的值为常量k的值也为常量因此可以计算出循环内j的增量也为常量2完成常量合并与传播之后变为j=j+2。
从生成的代码可以看出,寄存器ex存储的是变量j的值,且j的增量为常量2,除ex之外并无其他寄存器使用;进入循环之前只有一次对寄存器ex的赋值,源代码中对i和k的赋值操作已经被删除。由此可以看出编译器实施了删除无用赋值、常量合并与传播的优化措施。

考点:语言,程序