【问题标题】:Variables declared inside a loop在循环内声明的变量
【发布时间】:2012-02-02 21:06:49
【问题描述】:

如果我要在循环内声明一个变量,那么在循环外进行声明会更快吗?程序是在每次迭代时为n 重新分配内存还是始终使用相同的内存位置?

for(int i=0;i<10;i++)
{
    int n = getNumber();
    printf("%d\n",n);
}

int n;
for(int i=0;i<10;i++)
{
    n = getNumber();
    printf("%d\n",n);
}

【问题讨论】:

    标签: c for-loop


    【解决方案1】:

    对于大多数现代编译器来说,这无关紧要。他们将尽可能高效地分配处理器寄存器或将变量放在堆栈上。

    【讨论】:

      【解决方案2】:

      任何现代编译器都会将这些优化为相同的机器代码,因此您应该看不出有什么区别。

      【讨论】:

      • 在循环中定义更清晰,并且可能产生更优化的代码,因为编译器知道生命周期(尽管可能不是简单类型)
      【解决方案3】:

      变量并没有真正“创建”或“销毁”。它们是编程语言抽象级别的概念。编译器不需要在变量和内存地址之间进行一对一的映射。实际上,大多数情况下,局部变量的堆栈空间是在函数开始时立即分配的,因此不会影响性能。

      请注意,与没有构造函数概念的 C 不同,C++ 支持对象构造和销毁,因此如果您要在 for 循环中定义类类型的变量,如下所示,

      class MyClass { 
          public: MyClass() { cout << "hello world" << endl; }
      };
      //...
      for (int i = 0; i < 10; ++i) {
         MyClass m;
      } 
      

      你每次都会调用它的构造函数,有效地打印“hello world”十次。这与 C 声明非常不同,不应与它混淆。

      【讨论】:

      • 谢谢,我的意思是每次迭代都会重新分配内存。我已经改变了问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多