【问题标题】:lifetime of declaration within a loop循环内声明的生命周期
【发布时间】:2010-09-22 11:18:15
【问题描述】:

我有一个循环如下

while(1)
{
    int i;
}

每次循环发生时,i 是否会在堆栈上被销毁并重新创建?

【问题讨论】:

标签: c++ c


【解决方案1】:

理论上,它会被重新创建。实际上,出于优化原因,它可能会保持活动状态并重新初始化。

但从您的角度来看,它会被重新创建,并且编译器会处理优化(即,只要它是 pod 类型,就将其保持在最里面的范围内)。 p>

【讨论】:

  • 如果我在一个循环中运行了很多次,我是否需要担心堆栈问题?
  • 顺便说一句,我认为问题是优化
【解决方案2】:

不一定。您的编译器可以选择将其更改为

int i;
while(1) { 
     ...
     i = 0; 
}

它可能不是每次都在堆栈上创建和销毁。但是,从语义上讲,这就是发生的情况,当您在 C++ 中使用具有自定义销毁行为的更复杂的类型时,就会发生这种情况,尽管编译器仍可能选择单独保存堆栈内存。

【讨论】:

  • i = 0 来自哪里?堆栈变量在 C 或 C++ 中没有默认值。
  • 我正在考虑重置 i 的值,否则它的破坏语义将不会被保留,但是由于我意识到 OP 没有初始化他的 i,它的值实际上是未定义的,并且任何编译器都没有不需要插入。
【解决方案3】:

从概念上讲,是的。但是由于没有对值做任何事情,编译器很可能会在循环的每次迭代中生成对变量不做任何事情的代码。例如,它可以提前分配(当函数进入时),因为它会在以后使用。

由于您不能引用定义范围之外的变量,因此不会改变语义。

【讨论】:

    【解决方案4】:

    C 中,您必须查看生成的程序集才能知道这一点(编译器可能已选择将其放入寄存器)。

    您知道的是,在循环之外,您无法通过任何方式访问该特定对象(通过名称、通过指针、通过 hack,...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-02
      • 2021-05-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多