2015-05-10 202 views
0

考虑下一个循环一个循环内声明的变量

for(int i = 0; i < 99999999; i++) 
{ 
    double d1 = (double)i/10; 
    double d2 = (double)i/100; 

    std::cout << d1 * d2 << std::endl; 
} 

据我所知,应用程序将分配和堆栈上的免费16个字节的内存(双是8个字节我的机器上),每次迭代在循环中。这是真的,还是编译器足够聪明,知道只有在循环结束时才释放内存?

问题是循环内部的变量声明使代码更具可读性(imo)。

+1

我想这够聪明。 – Maroun

+3

你意识到在堆栈上“分配”内存只是移动CPU的堆栈指针,对吧?但是,是的,编译器几乎可以肯定地为整个事情执行一次堆栈调整,而不是每次迭代。检查汇编器输出是否确定。 –

+0

您可以添加静态。这将保证他们将被分配一次。 –

回答

3

堆栈分配无非是增加和减少寄存器的值。

即使编译器是愚蠢的,这意味着每次迭代最多执行1次ADD和1个SUB指令。这在任何情况下都是不可能的,因为编译器知道它们是循环中的局部变量,并且它们不能改变它们的大小。

实际上它们也可能不能保持在堆栈上,因为它们可能适合整个循环的两个浮点寄存器。