(一)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