2012-01-04 215 views
16

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

回答

12

變量是不是真正的 「創建」 或 「破壞」。它們是編程語言抽象層面的概念。編譯器不需要在變量和內存地址之間具有一對一映射。實際上,在大多數情況下,局部變量的堆棧空間在函數的開頭一次被分配,所以它在性能上不會有任何區別。請注意,與C不同,C不支持構造函數,因此如果要在for循環中定義一個類類型的變量,如下所示,

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

你會每次調用它的構造函數,有效地打印「hello world」十次。這與C聲明非常不同,不應與它混淆。

+0

謝謝,我的意思是在每次迭代時重新分配內存。我改變了這個問題。 – 2012-01-05 00:02:31

14

任何現代編譯器都會將這些優化爲相同的機器碼,所以您應該看到沒有區別。

+2

在循環中定義更清晰,並且可能會生成更多優化的代碼,因爲編譯器知道生命週期(儘管可能不適用於簡單類型) – 2012-01-04 23:52:45

1

對於大多數現代編譯器來說,這並不重要。他們將分配處理器寄存器或儘可能高效地將變量放在堆棧上。