我一直在查看一些简单的 C 代码以及使用不同优化级别的 GCC 的不同输出。
C代码
#include <stdio.h>
int main() {
    int i = 0;
    while(i<10) {
            printf("Hello\n");
            i++;
    }
    i = 0;
    while(i<10) {
            printf("i: %d\n", i);
            i++;
    }
}
当我使用-Osor编译代码时-O2,第一个循环的工作方式略有不同。它是减少而不是增加,它有两种不同的方式。我想知道为什么它递减的,而不是在代码中增加等,之间的差异小-Os和-O2。
-Os 编译
0x400486 <main+6>       mov     edi,0x40068c
0x40048b <main+11>      call    0x400450 <puts@plt>
0x400490 <main+16>      dec     ebx
0x400492 <main+18>      jne     0x400486 <main+6>
-O2 编译
0x400490 <main+16>      mov    edi,0x40069c
0x400495 <main+21>      call   0x400450 <puts@plt>
0x40049a <main+26>      sub    ebx,0x1
0x40049d <main+29>      jne    0x400490 <main+16>