如果我要在循环内部声明一个变量,那么将循环声明放在循环之外会更快吗?程序是否在每次迭代时重新分配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);
}
如果我要在循环内部声明一个变量,那么将循环声明放在循环之外会更快吗?程序是否在每次迭代时重新分配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不同,C不支持构造函数,因此如果要在for循环中定义一个类类型的变量,如下所示,
class MyClass {
public: MyClass() { cout << "hello world" << endl; }
};
//...
for (int i = 0; i < 10; ++i) {
MyClass m;
}
你会每次调用它的构造函数,有效地打印“hello world”十次。这与C声明非常不同,不应与它混淆。
任何现代编译器都会将这些优化为相同的机器码,所以您应该看到没有区别。
在循环中定义更清晰,并且可能会生成更多优化的代码,因为编译器知道生命周期(尽管可能不适用于简单类型) – 2012-01-04 23:52:45
对于大多数现代编译器来说,这并不重要。他们将分配处理器寄存器或尽可能高效地将变量放在堆栈上。
谢谢,我的意思是在每次迭代时重新分配内存。我改变了这个问题。 – 2012-01-05 00:02:31