文章目录
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)