循环内部或循环外部的局部变量

时间:2015-06-08 19:45:38

标签: c++

void main(){
   int a=1;

   for(int i=0;i<10;i++){
      int b=2;
   }
}

在循环中,每次在循环中都会创建变量B,对吧?如果是这样,我使用&amp;检查变量b的地址。操作,发现地址完全一样。如果没有重新创建,则b应该仍然在堆栈中。每次它都会在循环中声明一个新变量b。为什么这里没有发生重新定义错误?

5 个答案:

答案 0 :(得分:2)

每次输入该块时,都会重新创建块中定义的(非静态)变量。

如果它是局部变量,它可以很容易地驻留在块的连续条目上的相同地址。在i = raw_input('what number would you like to increment?') if 0<int(i)<9: return(re.sub('({})'.format(i),addone,s)) else: return "Number out of range" 的情况下,不需要做任何事情(除了分配空间)来创建变量。

另一方面,如果你要创建一个带有构造函数的类型的对象,那么无论构造函数在每次输入该块时执行什么操作(每次执行离开块时析构函数都会运行)

答案 1 :(得分:0)

每次迭代的变量创建都得到了优化,相反,它只需在循环中每次迭代时进行一次初始化。请参阅this question

答案 2 :(得分:0)

每次迭代都在同一位置有一个新的b 由于下一次迭代中不存在“旧”,因此可以重用其占用的空间 如果没有发生这种情况,你很快就会耗尽内存。

答案 3 :(得分:0)

当一个对象被声明并初始化时,我们需要考虑两件事:

  1. 为对象分配内存。
  2. 初始化对象。
  3. 当为函数创建堆栈帧时,堆栈帧通常不仅有足够的空间用于函数作用域中的自动变量,还有函数中的局部变量。在那种情况下,当行

      int b=2;
    

    在循环中执行,唯一发生的是在循环的每次迭代中重新初始化变量的值。

    运行时环境很可能在进入循环时将b所需的内存推入堆栈帧,并在循环结束时弹出内存。

    如果运行时环境使用第一个策略,则b的地址在循环的每次迭代中都是相同的。

    在运行时环境中使用第二种策略,b的地址很可能在循环的每次迭代中都相同。我犹豫是否要说明一点&#34;将会是相同的&#34;因为我不确定。

答案 4 :(得分:0)

不会在堆上创建局部变量。我们说它们是在堆栈上创建的。但实际上,寄存器用于存储局部变量(如果可用)。存储在寄存器中比在堆栈中存储要便宜得多。每次在循环中遇到int b = 2行时,重写寄存器。因此,您不会得到重新定义错误。这就是每次迭代都会丢失b值的原因。

相关问题