【问题标题】:What is lifetime of variable inside block?块内变量的生命周期是多少?
【发布时间】:2016-07-20 00:12:41
【问题描述】:

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

为了证明我试过这个:

 int main()
{

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

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

}

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

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 应该在这里创建,因此在上面的输出中,两个地址应该相等,但不是吗?变量是否在块结束时被销毁?如果不是,为什么?

【问题讨论】:

  • char * 传递给printf("%d") 的未定义行为。此外,具有自动存储持续时间的单独对象的相对地址未指定。这可能还取决于编译器优化设置。
  • 使用%p打印printf中的指针。
  • 你是如何编译你的代码的?你启用优化了吗?
  • @BasileStarynkevitch 不,我没有
  • 请记住,仅仅因为您获取变量的地址,您就将它们强制到堆栈中,否则编译器可能会将它们分配到 CPU 寄存器中。

标签: c++ c memory x86 stack


【解决方案1】:

对于编译器如何在内存中放置变量没有规则。如果这在某种程度上“更容易”的话,它可以很好地同时为他们两个保留空间。

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

【讨论】:

    【解决方案2】:

    在 C++ 中销毁变量意味着“将其称为析构函数”。仅此而已,仅此而已。由于像chars 这样的内置类型没有析构函数,因此观察者看不到销毁它们。

    【讨论】:

    • @NathanOliver,我在哪里说的不是?
    • @NathanOliver,你有什么证据吗?假设 b 不是一个 char 而是一个带有副作用构造函数的对象,你认为这个构造函数什么时候会被执行?
    • @NathanOliver,我不知道标准对于平凡/非平凡的构造函数有区别。我将删除最后一段。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2010-09-19
    相关资源
    最近更新 更多