C/C++ 配列の処理途中での初期化
仕事でプログラム組んでると、構造体の初期化は時々悩みます。
構造体宣言時に初期化する時は、以下のように書けば良いかと思います。
typedef struct hoge_ { int a; float b; } hoge; hoge data[10] = {0};
ただ、メンバなどに持っている配列を、処理途中にその都度初期化したい場合があると思います。
みんなどうしてんの?って気になったのでググったが、明快な答えが意外に少ない。
見たところ3パターンありそうです。
①愚直にループで初期化
構造体のメンバ数が少ない、配列数が少ない場合はまだいいけど、配列数が増えると処理が遅いですね。
また、後からメンバが増えると初期化漏れが発生する可能性があるので、あまりよろしくないかと思います。
for(i = 0; i < 10; i++) { data[i].a = 0; data[i].b = 0.0; }
②memsetで初期化
この方法で初期化している人は多いと思います。
構造体のメンバが整数値、ポインタのみならいいけど、floatなんか入っていると、処理系によっては0でクリアされないですね。
移植性を気にしなければ、いいかも。
memset(data, 0, sizeof(hoge)*10);
③初期化済みデータを代入
私はこの方法でやってます。
いちいち初期化データ容易するのがめんどいですが、移植性考えてこの方法でやってます。
hoge init_data = {0, 0.0}; for(i = 0; i < 10; i++) { data[i] = init_data; }
個人的には③でやってますが、頻繁にCallされて巨大な配列の場合は処理速度が気になるので②のmemsetも検討して使ってます。
もっとスマートな方法あれば教えてください。。。。