for循环
假设有如下代码,求1到99的和;
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return 0;
}
利用gdb的-g选项生成调式文件,执行调试文件,用disas对main函数进行反汇编.得到下图所示汇编代码。
注: cmpl S2,S1 S1 – S2比较双字,差关系。JG: 大于转移指令,0x63=99(十进制)。
即for(初始化表达式; 循环条件; 表达式) 语句块
被编译为
初始化表达式;
Label1: if(!循环条件) goto Label2;
代码块;
表达式;
goto Label1;
Label2:
从上面可以看到for循环必须执行两次jump,一次是当循环条件为false时,另一次则是在计算完表达式之后;jump指令影响指令的流水,至于while循环,其编译结果和for循环类似
do while循环
即do 语句块 while(循环条件) 被编译为
初始化表达式;
Label1:
代码块;
if(循环条件) Label1;
从上面可以看到for循环处理为do循环通常可以提高执行速度。