はじめに
私はC/C++を学び始めて一年にも満たない専門学生です。
読書メモをQiitaに投稿するという課題が出されたので現在読書中であるEffective C++第3版 第5章26項の読書メモを投稿します。
変数の定義は可能な限り先延ばしにする
コンストラクタ・デストラクタを持つ型の変数を定義すると変数が生成・破棄されるときにコストがかかるので、使われない変数による無駄なコストがかからないように注意が必要。
void Swap(int* a,int* b){
// a が bよりも大きかった時、使用されない
int tmp
if(a < b){
tmp = *a;
*a = *b;
*b = tmp;
}
}
変数は初期化する値が決まるまで定義しない方がよい。
「デフォルトコンストラクタで生成したオブジェクトに代入し、値を与える」 よりも 「最初に必要な値を与えてオブジェクトを生成する」
の方が効率が良いので、定義を可能な限り先延ばしにすることによって不要なオブジェクトの生成・破棄、不要なデフォルトコンストラクタの使用を避けることができ、プログラムが明快になり効率的になる。
変数の定義はループの内か外か
変数がループの中だけで使われる場合以下の2種類の方法が考えられる。
//ループの外で定義
//クラスでも構造体でも良い
App a;
for (int i = 0; i < 10; ++i){
a = i に依存する値;
…
}
//ループ内で定義
for (int i = 0; i < 10; ++i){
App a(iに依存する値);
…
}
上記の2つの方法でかかるコストは
- 方法A : 生成1回、破棄1回、代入10回
- 方法B : 生成10回、破棄10回
コストが 1回の代入 < 一組の生成、破棄 の場合
一般的に方法Aが効率的
しかし、aを必要以上に大きなスコープで有効にしているため分かりにくい。
それ以外の場合
方法Bの方が効率的
つまり、1回の代入が1組の生成と破棄よりコストがかからず、その部分では効率が重要な時以外は方法Bを使うべき。
結論
変数の定義を可能な限り先延ばしにすることでプログラムは明快になり効率的にもなる。
参考文献
https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0