无限循环while(1)和for(;;)区别
1. 无限循环while(1)和for(;;)区别
1.1 结论:性能相同
-
for(;;),这两个;;空语句,编译器一般会优化掉的,直接进入死循环。 while(1),每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事。 gcc version 9.3.0 (GCC),从汇编的角度来说,都会优化掉的
1.2 验证
1.2.1 编写两个文件for.c和while.c
// filename: for.c
int main(int argc, char const *argv[])
{
for(;;)
{
}
return 0;
}
// filename: while.c
int main(int argc, char const *argv[])
{
while(1)
{
}
return 0;
}
1.2.2 生成汇编文件for.s和while.s
gcc -S -o for.s for.c gcc -S -o while.s while.c
1.2.3 对比汇编文件
除了文件名不同,其余都相同。
; filename: for.s .file "for.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 movl %edi, -4(%rbp) movq %rsi, -16(%rbp) .L2: jmp .L2 .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 9.3.0" .section .note.GNU-stack,"",@progbits
; filename: whiles .file "while.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 movl %edi, -4(%rbp) movq %rsi, -16(%rbp) .L2: jmp .L2 .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 9.3.0" .section .note.GNU-stack,"",@progbits
1.2.4 gcc版本
$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-9.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib Thread model: posix gcc version 9.3.0 (GCC)
