什么是变量内部块的生命周期?

时间:2016-03-31 13:39:25

标签: c++ c memory x86 stack

HereHere我发现块中的变量是在执行到达该块时创建的,

要证明我试过这个:

 int main()
{

  {
      char a;
      printf("Address of a %d \n",&a);
  }

  char b;
  printf("Address of b %d \n",&b);

}

正如预期的那样 b 首先被创建(因为外部块比内部执行更早),并且当执行到达内部块时,创建了。输出上述代码:

Address of a 2686766
Address of b 2686767

(在x86上测试(堆栈向下增长,因此首先创建了具有更大地址的变量)。)

但是这个怎么样?:

int main()
{

   {
       char a;
       printf("Address of a %d \n",&a);
   } // I expected that variable a should be destroyed here


   {
       char b;
       printf("Address of b %d \n",&b);
   }

}

输出:

Address of a 2686767
Address of b 2686766

我预计 a 在第一个块语句的右括号处被销毁,因此 a 所在的地址现在位于堆栈顶部,而 b < / em>应该在这里创建,因此在输出上面两个地址应该相等,但它们不是?在块结束时变量是否被破坏?如果没有,为什么?

2 个答案:

答案 0 :(得分:10)

编译器如何将变量放入内存中没有规则。如果在某种程度上“更容易”,它可以同时为两者保留空间。

允许 为不同范围内的变量重用空间,但不是必需的。保存单个字节可能不值得尝试“优化”分配。

答案 1 :(得分:0)

在C ++中销毁变量意味着“调用它的析构函数”。没有别的,没有别的。由于像char这样的内置类型没有析构函数,因此观察者无法销毁它们。