關於 for(;;); 和while(1);的區別
阿新 • • 發佈:2018-11-14
(一)gcc編譯後好看彙編程式碼發現無區別:
#include <stdio.h> int main(void) { #if 1 while(1) { } #else for(;;) { } #endif return 0; } $ gcc -E a.c -o a.i $ gcc -S a.i -o a.s //檢視兩個檔案相應的彙編程式碼,發現是一樣的; 都是直接 原地跳轉的 .file "a.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 .L2: jmp .L2 .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609" .section .note.GNU-stack,"",@progbits
(二)Visual Studio 斷點 發彙編跟蹤發現 有區別: 程式碼size 和 執行速度, for死迴圈更好一些
//----------------------------------------------------------------------------- //彙編結果: 有 test 操作去判斷while的條件 while(1) 00D013CE mov eax,1 00D013D3 test eax,eax 00D013D5 je wmain+29h (0D013D9h) { } 00D013D7 jmp wmain+1Eh (0D013CEh) system("pause"); 00D013D9 mov esi,esp //----------------------------------------------------------------------------- //彙編結果 無條件判斷 執行會快一些 for(;;) { } 00FC13CE jmp wmain+1Eh (0FC13CEh) system("pause"); 00FC13D0 mov esi,esp