Is there any overhead to declaring a variable within a loop? (C++)

This question already has an answer here:

  • Difference between declaring variables before or in loop? 24 answers

  • Stack space for local variables is usually allocated in function scope. So no stack pointer adjustment happens inside the loop, just assigning 4 to var . Therefore these two snippets have the same overhead.


    For primitive types and POD types, it makes no difference. The compiler will allocate the stack space for the variable at the beginning of the function and deallocate it when the function returns in both cases.

    For non-POD class types that have non-trivial constructors, it WILL make a difference -- in that case, putting the variable outside the loop will only call the constructor and destructor once and the assignment operator each iteration, whereas putting it inside the loop will call the constructor and destructor for every iteration of the loop. Depending on what the class' constructor, destructor, and assignment operator do, this may or may not be desirable.


    They are both the same, and here's how you can find out, by looking at what the compiler does (even without optimisation set to high):

    Look at what the compiler (gcc 4.0) does to your simple examples:

    1.c:

    main(){ int var; while(int i < 100) { var = 4; } }
    

    gcc -S 1.c

    1.s:

    _main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        movl    $0, -16(%ebp)
        jmp L2
    L3:
        movl    $4, -12(%ebp)
    L2:
        cmpl    $99, -16(%ebp)
        jle L3
        leave
        ret
    

    2.c

    main() { while(int i < 100) { int var = 4; } }
    

    gcc -S 2.c

    2.s:

    _main:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $24, %esp
            movl    $0, -16(%ebp)
            jmp     L2
    L3:
            movl    $4, -12(%ebp)
    L2:
            cmpl    $99, -16(%ebp)
            jle     L3
            leave
            ret
    

    From these, you can see two things: firstly, the code is the same in both.

    Secondly, the storage for var is allocated outside the loop:

             subl    $24, %esp
    

    And finally the only thing in the loop is the assignment and condition check:

    L3:
            movl    $4, -12(%ebp)
    L2:
            cmpl    $99, -16(%ebp)
            jle     L3
    

    Which is about as efficient as you can be without removing the loop entirely.

    链接地址: http://www.djcxy.com/p/29800.html

    上一篇: 在循环之前或循环中声明变量之间的区别?

    下一篇: 在循环中声明一个变量是否有任何开销? (C ++)