2012-01-04 21 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

対変数は本当に "作成" または "破壊" されていません。それらはプログラミング言語の抽象レベルの概念です。コンパイラは、変数とメモリアドレスの間に1対1のマッピングを持つ必要はありません。実際には、ほとんどの場合、ローカル変数のスタック領域は関数の初めに一度に割り当てられるため、パフォーマンスに違いはありません。

コンストラクタの概念を持たないC++とは異なり、オブジェクトの構築と破壊をサポートしているので、forループでクラス型の変数を定義する場合は、

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

あなたはそのコンストラクタを毎回呼び出して、効果的に "hello world"を10回印刷します。これはCの宣言とは非常に異なり、混乱させるべきではありません。

+0

ありがとう、私は、各反復でメモリを再割り当てすることを意味しました。私は質問を変更しました。 –

14

現代のコンパイラはこれらを同じマシンコードに最適化するので、違いは見られません。

+2

コンパイラがライフタイムを知っているため、ループ内での定義がより明確になり、より最適化されたコードが生成される可能性があります(シンプルタイプではないかもしれません) –

1

最新のコンパイラでは、これは問題ではありません。彼らはプロセッサレジスタを割り当てるか、変数を可能な限り効率的にスタックに配置します。

関連する問題