while (1) 和 for (;;)

本文探讨了在现代编译器下,while (1) 和 for(;;) 两种无限循环的效率是否有所差异。过去由于编译器处理方式的不同,for(;;)可能被视为更高效,但在gcc-4.1.1-52-e15编译器的实例中,两者在汇编级别上生成的代码相同,因此效率一致。
摘要由CSDN通过智能技术生成

一、   背景

今天在网上看到一篇blog,文章题目是《C代码优化方案》,其中有一节说到while(1)和for(;;)两种无线循环,哪种效率更高?

但是,在现代编译器上,其实两种无线循环效率都是一样的。

二、   以前为什么会出现for(;;)比while(1)的无线循环的效率高呢?

在《C代码优化方案》中,这样写道:

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:

编译前:

while (1);

编译后:

mov eax,1

test eax,eax

je foo+23h

jmp foo+18h 

编译前:

for (;;);

编译后:

jmp foo+23h

显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。这是因为以前的编译器对这两种无线循环的编译处理不一致造成的。

三、   现代编译器(gcc-4.1.1-52-e15)对这两种无线循环的影响?

先看for.c

#include

#include

#include

int main()

{

       for(;;);</

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值