|
看代码看到for(;;),然后觉得为什么不写成while(1)呢,所以就做了下面的测试。 网上有解释,因为while需要做一次判断,理论上执行会花费的时间更久,for(;;)只是执行了两次空语句,执行会更快 for.c #include <stdio.h>0 K: J: ?0 F7 |3 Y% ~7 B8 f0 B. \8 X _int main(){& B$ K( _# J2 } for(;;)$ ?) w, Q% S# m. o9 ? printf("This is a loop\n");8 T. g1 p$ o2 ^% g4 o return 0;% q! P4 c2 s9 M$ q/ O8 g } while.c #include <stdio.h>int main(){ while(1)( s. m$ \4 m8 M1 ~! x% f printf("This is a loop\n"); return 0;+ y5 i; _+ B6 o6 a6 ^ } goto.c #include <stdio.h>int main(){ start: printf("This is a loop\n");4 P& g* _$ \% e; O0 T$ ~% s goto start;$ D5 q: L, @/ Y& i return 0; }5 t# P7 @: V8 X1 R7 G 用gcc -S xxx.c 执行后得到三个文件 for.s .file "for.c".text2 b/ H0 d: i6 ^& a( _ .section .rodata7 [ c: y2 o5 I .LC0: .string "This is a loop": w6 u/ l' B8 q3 t .text: C/ ]0 ]6 l& f .globl main .type main, @function main: .LFB0:( V# [; o9 h. U& }8 H .cfi_startproc pushq %rbp6 `* F, p6 N$ k6 l/ n .cfi_def_cfa_offset 168 K$ w$ Y, C* R3 F, ? .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 .L2: leaq .LC0(%rip), %rdi0 y8 O y5 S( q9 J/ T7 D call puts@PLT7 K; `8 j. p# \2 O+ P jmp .L2 .cfi_endproc% w3 Q% g. u2 x2 L .LFE0:/ |, k7 S! \$ _7 o- s) S. q* e" g .size main, .-main/ y4 ~, _# Y8 H1 E* m- k' U9 P .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0" .section .note.GNU-stack,"",@progbits while.s .file "while.c"3 D- o- j9 r" Y2 `.text .section .rodata .LC0:+ m. r' b( p' G2 g. j; z- h% n; a .string "This is a loop"% l3 K: H9 _) U; S .text .globl main .type main, @function. N: L" q& m* y- I0 B main:8 Q1 @: ]* A1 B0 q1 A+ G .LFB0:5 y( z3 ]( I: s3 o% K: @ .cfi_startproc4 r$ s) W% r# X0 N pushq %rbp2 X. m$ U. [: }; M4 A: ]2 O7 O .cfi_def_cfa_offset 165 g+ Y1 W0 P5 a .cfi_offset 6, -16( {2 W$ i7 p" a movq %rsp, %rbp4 u5 j+ z9 I) Y! |) M .cfi_def_cfa_register 63 `& E- O- D; I) u7 x0 G .L2:, T, ^7 p* w3 c leaq .LC0(%rip), %rdi8 t |: @* N5 x) h. N/ u call puts@PLT# |3 r8 a6 E8 U) u jmp .L25 a1 o8 w. [: H; J, ^ .cfi_endproc1 m& ?& j; L. n! _ .LFE0: .size main, .-main .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"( Q7 X- u( K. F .section .note.GNU-stack,"",@progbits goto.s .file "goto.c"5 S" T! m1 F2 B( J3 Z.text4 k4 X( N* X# R8 |4 ?1 i .section .rodata: _- E N# {$ n7 a' i- E/ s .LC0: .string "This is a loop"' [4 ^: ?& h: _: u; {+ L+ P" z .text .globl main& O( F$ K7 M/ K+ I& E0 [ .type main, @function. ]9 c3 n' a* X5 e main: .LFB0: .cfi_startproc/ C, I# G# n# H pushq %rbp8 V; R. b* R0 q, p .cfi_def_cfa_offset 16) `2 p% E* \4 B# G4 r0 t .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 .L2:. k% d6 n6 u" p. K, U' ^& X leaq .LC0(%rip), %rdi call puts@PLT jmp .L2 .cfi_endproc .LFE0: .size main, .-main8 R" C4 J$ N4 G* { .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0" .section .note.GNU-stack,"",@progbits gcc 版本 gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0Copyright (C) 2017 Free Software Foundation, Inc.4 k4 b R6 @4 w1 P This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 在上面测试结束后,我还特意打开了我的keil软件,结果发现两个生成的机器码都是一样的。 所以说,如果在项目中遇到这样的写法,就不要再感觉奇怪了,他们都是没啥问题的。 只不过for(;;)看起来更优雅一些。
还有一种情况while(1)里面的1是一个常量,在一些编译器中,设置的检查规则比较高的话,会提示一个警告,for(;;)就不会存在这种问题,因为里面就没有变量,也没有常量。 : C. @2 _) \ z9 M1 [: M( \) X |
微信公众号
手机版