MA-SATANのエンジニアブログ

とある大阪の日本酒Loveなエンジニアの開発ブログ

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も検討して使ってます。

もっとスマートな方法あれば教えてください。。。。