こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

int型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか?

//配列の初期化
int Xi[256];

for(i = 0; i < 256; i++){
   Xi[i] = 0;
}

今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。
速度重視でよろしくお願いします。

投稿日時 - 2008-09-04 23:51:38

QNo.4304433

困ってます

質問者が選んだベストアンサー

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。

#include <stdlib.h>
int *Xi = (int *)calloc(256, sizeof(int));

配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

投稿日時 - 2008-09-05 00:36:27

お礼

やっぱり、配列よりポインタのほうが高速なのでしょうかね。
参考にさせていただきます。

投稿日時 - 2008-09-06 04:44:36

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

処理系不明のままでは、まともな回答は得にくいと思います。

インタープリタの場合はループで記述すると十分遅いと思いますし、そこまでいかなくても、(たとえ今時のものでも)8ビットマイコンなんかでは高速とはいいがたいでしょうね(かといって、代案があるかどうかはハードウェアしだい)。

というわけで、処理系を補足してください。

投稿日時 - 2008-09-05 14:28:14

ANo.5

いまどきのCPUなら、それで十分高速。
それ以上の高速化を望むなら、アセンブラ出力を見ながらゴリゴリやることになるので、CPU情報がないとなんともいえません。

投稿日時 - 2008-09-05 11:04:57

ANo.4

Cの仕様の範囲では、

int Xi[256] = {0};

が最速になる可能性が一番高いはずです。
callocは非常に遅いので論外です。

もっと速くということであれば、アセンブリ言語でアーキテクチャに依存したコードを書く必要があります。

投稿日時 - 2008-09-05 10:00:31

ANo.3

int Xi[256] = {0};
で全要素が0で初期化されます。
(初期化子の要素数が、配列の要素数よりも少ない場合、
残りの要素は全て0で初期化されるため。)
速度はどうか知らないけど書くのは楽。

速度に関してはコンパイラの最適化が効いてるなら特にどうこうする必要はないでしょう。

投稿日時 - 2008-09-05 05:42:44

ANo.1

最近のコンパイラであれば、おそらく、そのままで最速なコードが生成されると思います。下手になんかしないほうが多分速い。

もし、本当にコンパイラが生成するコードよりも速い方法がほしいとなると、これはもう、初期化の部分だけではなくて、実際に配列を使う部分のアルゴリズムも一緒に考えて、配列の一部をレジスタにもつとか、かなりトリッキーなことをすることになると思います。

投稿日時 - 2008-09-05 00:16:38

あなたにオススメの質問