C/C++ for while性能简单分析

来源:互联网 发布:淘宝发帖怎么发求链接 编辑:程序博客网 时间:2024/05/24 04:31

今天看一个文章

<想成为嵌入式程序员应知道的0x10个基本问题>

其中有一个十这样写的:

<<<<<<<<<<<<< 

 

4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

{

}

 

一些程序员更喜欢如下方案:

for(;;)

{

}

 

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。

 

>>>>>>>>>>>>>>>>>> 

 

其实我们一直偏向

for(;;)

{

}这样去写的。

 

因为直觉这样生成的汇编代码要简洁,为了验证自己想法写了简单的文件测试了下

//test_while.c

int main()

{

while(1){}

}

 

//test_for.c

int main()

{

for(;;){}

}

 

cl /FA /c test_while.c test_for.c 命令可以在文件所在目录下生成test_while.asm test_for.asm的文件.

生成文件入下:

 

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01

 

                TITLE      D:/test_for.c

                .686P

                .XMM

                include listing.inc

                .model  flat

 

INCLUDELIB LIBCMT

INCLUDELIB OLDNAMES

 

PUBLIC _main

; Function compile flags: /Odtp

_TEXT    SEGMENT

_main   PROC

; File d:/test_for.c

; Line 2

                push      ebp

                mov       ebp, esp

$LN2@main:

; Line 3

                jmp        SHORT $LN2@main

; Line 4

                pop        ebp

                ret          0

_main   ENDP

_TEXT    ENDS

END

 

 

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01

 

                TITLE      D:/test_while.c

                .686P

                .XMM

                include listing.inc

                .model  flat

 

INCLUDELIB LIBCMT

INCLUDELIB OLDNAMES

 

PUBLIC _main

; Function compile flags: /Odtp

_TEXT    SEGMENT

_main   PROC

; File d:/test_while.c

; Line 2

                push      ebp

                mov       ebp, esp

$LN2@main:

; Line 3

                mov       eax, 1

                test        eax, eax

                je            SHORT $LN3@main

                jmp        SHORT $LN2@main

$LN3@main:

; Line 4

                pop        ebp

                ret          0

_main   ENDP

_TEXT    ENDS

END

 

 

 

注意上面asm文件Line 3Line 4之间的代码,事实证明至少在VSfor生成的代码比while更加简洁