如果我要在循環內部聲明一個變量,那麼將循環聲明放在循環之外會更快嗎?程序是否在每次迭代時重新分配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