

初歩的な質問です．下記のようなコードがあったとします．

[code]

    for(int i=0; i<100; ++i)
    {
        int a = i;
        std::cout << a << std::endl;
    }
    
[/code]

ここで，aはforの中でしか使用しません．しかし，スコープをできるだけ小さくしたほうがいいからといってforの中に入れて何回も宣言させるのは効率が悪い気がします．つまり，

[code]

    int a;
    for(int i=0; i<100; ++i)
    {
         a = i;
        std::cout << a << std::endl;
    }
    
[/code]

このようなプログラムとではスコープが大きくなる以外で何か不都合が起きたりするのでしょうか．


CC BY-SA 3.0
2017-12-03T04:53:18.197
39994
2017-12-18T03:20:06.477
23768
question
java c++ c
変数のスコープはfor内に入れてでもできるだけ狭くしたほうがいいか？


C++言語にはコンストラクタ・デストラクタが存在します。

>
[code]

>     int a = i;
>  
[/code]

は`i`で初期化されますが

>
[code]

>     int a;
>     a = i;
>  
[/code]

は空で初期化した上で、後から`i`をコピー・代入を行っています。また、デストラクターが実行されるタイミングも後者は`for`ループ終了直後ですが、前者はスコープを抜けるまでそのまま生き続けます。  
単純な整数であれば違いはありませんが、汎用性を考慮すれば常に適切な変数スコープを意識すべきです。

これに関連して、C++言語では`for`だけでなく`if`や`switch`でも効率的な変数宣言できるように拡張されています。[if文とswitch文の条件式と初期化を分離](https://cpprefjp.github.io/lang/cpp17/selection_statements_with_initializer.html)


CC BY-SA 3.0
2017-12-03T05:06:51.200
39995
2017-12-03T22:55:19.990
2017-12-03T22:55:19.990
4236
4236
39994
answer


> しかし，スコープをできるだけ小さくしたほうがいいからといってforの中に入れて何回も宣言させるのは効率が悪い気がします

メモリー効率的には変わらず実行速度的にも変わらず、可読性が向上するので積極的にスコープは小さくしましょう。


CC BY-SA 3.0
2017-12-03T15:19:02.213
40004
2017-12-03T15:19:02.213
23941
39994
answer


質問文を読み、変数宣言にかかるコストに対して懸念が有る、というふうに理解しました。  
私も以前同様の疑問を抱き、Java(Java5)とC(GCC 4.4.3)調べてみたことがあります。

  * [ループ内で変数を宣言しない方が良いのか: 発火後忘失](http://feather.cocolog-nifty.com/weblog/2010/05/post-a00a.html)  
(※7年以上前の話なので、疑問の発端となったページは消えてしまっていますが…)

結論としては、ループ外で宣言しようが中で宣言しようが **効率は完全に同一である** 、というものでした。  
コンパイル後のバイトコード/アセンブリからは変数宣言した、という情報は無くなっていました。つまりローカル変数宣言にかかるコストはゼロです。


CC BY-SA 3.0
2017-12-18T03:20:06.477
40350
2017-12-18T03:20:06.477
2808
39994
answer