再看JDK源码的时候发现,“死循环”有两种写法:for(;;)和while(true),
我就疑问,两者有啥区别,有啥源码中多数是for( ; ; )这种形式的,
编译前 编译后
while (1); mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前 编译后
for (;;); jmp foo+23h
一目了然,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。
也就是说两者在在宏观上完全一样的逻辑,但是底层完全不一样,for相对于来说更加简洁明了。
但是在ARM上,这两个无差别
arm-linux-gcc -S -o d.S 4.c
都是:
L2:
b .L2