在循环中声明一个变量是否有任何开销? (C ++)
这个问题在这里已经有了答案:
局部变量的堆栈空间通常在函数范围内分配。 所以在循环内部不会发生堆栈指针调整,只需将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++?