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

这个问题在这里已经有了答案:

  • 在循环之前或循环中声明变量之间的区别? 24个答案

  • 局部变量的堆栈空间通常在函数范围内分配。 所以在循环内部不会发生堆栈指针调整,只需将var指定为4即可。 因此这两个片段具有相同的开销。


    对于原始类型和POD类型,它没有区别。 编译器将在函数的开头为变量分配堆栈空间,并在两种情况下函数返回时释放该空间。

    对于具有非平凡构造函数的非POD类类型,它会有所作为 - 在这种情况下,将变量放在循环外面只会调用构造函数和析构函数一次,赋值运算符每次迭代,而将其放入循环会为循环的每次迭代调用构造函数和析构函数。 根据类的构造函数,析构函数和赋值运算符的作用,这可能会也可能不需要。


    它们都是相同的,通过查看编译器的功能(即使没有将优化设置为高),您可以通过以下方法找到它们:

    看看编译器(gcc 4.0)对你简单的例子做了什么:

    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
    

    从这些,你可以看到两件事:首先,两个代码是相同的。

    其次,var的存储被分配在循环之外:

             subl    $24, %esp
    

    最后,循环中唯一的事情是分配和条件检查:

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

    无需完全去除循环就可以达到最高效率。

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

    上一篇: Is there any overhead to declaring a variable within a loop? (C++)

    下一篇: How to implement classic sorting algorithms in modern C++?