• ベストアンサー

int型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか? //配列の初期化 int Xi[256]; for(i = 0; i < 256; i++){    Xi[i] = 0; } 今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。 速度重視でよろしくお願いします。

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。 #include <stdlib.h> int *Xi = (int *)calloc(256, sizeof(int)); 配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

kerneru
質問者

お礼

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

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

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

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

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

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

Cの仕様の範囲では、 int Xi[256] = {0}; が最速になる可能性が一番高いはずです。 callocは非常に遅いので論外です。 もっと速くということであれば、アセンブリ言語でアーキテクチャに依存したコードを書く必要があります。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

int Xi[256] = {0}; で全要素が0で初期化されます。 (初期化子の要素数が、配列の要素数よりも少ない場合、 残りの要素は全て0で初期化されるため。) 速度はどうか知らないけど書くのは楽。 速度に関してはコンパイラの最適化が効いてるなら特にどうこうする必要はないでしょう。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

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

関連するQ&A

  • 配列長参照のオーバーヘッド

    for等ループでループ終了条件に配列長を使用する場合、配列長を毎回参照する場合と一旦変数に格納して参照する場合、定数を使用する場合と処理速度の差はありますか? つまり 1、for( int i = 0; i < array.length; i++ ) { ... } 2、for( int i = 0; i < len; i++ ) { ... } *(int len=array.length) 3、for( int i = 0; i < 10; i++ ) { ... } *(int[] array = new int[10]) forループ内の処理のメモリ使用量の多寡は不明で、毎ループで読み取られる全ての変数はコンピュータのキャッシュに残るかどうかは不明だとします。

    • ベストアンサー
    • Java
  • 配列の中に複数存在する数がいくつあるか

    お世話になります。配列の中に同じ数が存在する数がいくつあるかを調べたいのですが、途中でつまづいてしまいました。 例えば配列arrayの中に、0, 0, 5, 0, 5, 1, 5といった数が格納されているとしたら 複数ある数は0と5の2つなので、2を返す、というだけのプログラムです。 int n=array.length; int cnt=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(array[i]==array[j]){ cnt++; break; } } } return cnt; forループで配列0から同じ数を順番に調べ、もしヒットすればカウントを増やして内側のループをブレイクし、配列1からまた順番に調べようとしたのですが、 上の例の場合、配列0と配列1が同じ数(0)ですので、カウントが余計に増えてしまいます。 どのように組めばうまく動作するでしょうか。宜しくお願いします。

    • ベストアンサー
    • Java
  • 配列の初期化に関する質問です

    配列を初めにAB[10]={0,1,・・・・,0}のように宣言すればちゃんと動くのですが, int l_AB=10; としてからAB[l_AB]={0,1,・・・・,0}とすると「配列初期化子内の要素が多すぎます」となりコンパイルできません。自分には何が違うのかよくわかりません。出来ないのが普通なのでしょうか? #include<stdio.h> #include<stdlib.h> int main() { int l_AB = 10; int AB[l_AB]={0,1,1,1,1,0,1,1,1,0}; int i=0; for(i=0;i<l_AB;i++){ printf("%d",AB[i]); } }

  • 二つのint型配列を一つにするには?

    2種類のint型配列にそれぞれ数が重ならないように数字を代入して行きます。この2種類のプログラムの違いは値を代入する方法以外はすべて同じです。ですから、ユーザー関数で一つにまとめようと考えてます。 2種類の違い:値を代入する方法がが違う。 (1)scanf()関数で人間が値を各要素に代入する。 (2)rand()関数でPC側が値を各要素に代入する。 配列への代入のルール (1)同じ値の場合は代入しなおさなければならない。 基本的には 人間側が値を要素に代入する場合 for( i = 0 ; i < 6 ; i++){ while(1){ scanf("%d",&dut[i]); for (j = 0; j < i ; j++){ if(dut[i] == dut[j]){flg = 1; break;} } if (flg == 0){break;} } } PC側がrand()関数を使い各要素に入力した場合 for( i = 0 ; i < 6 ; i++){ while(1){ pc[i] = rand()%43 + 1; for (j = 0; j < i ; j++){ if(pc[i] == pc[j]){flg = 1; break;} } if (flg == 0){break;} } } 以上の二つの違うところは「rand()関数かscanf()」どちらかが入るだけです。あとはみな同じつづりなのです。だから一つに出来ると思うのです。 共有して使える関数はどんどんまとめちゃうのが私の考えですので。 ※ヘッダ呼び出しや、変数定義など基本的な部分は省いてあります。 間違いがあるときはおしえてください。 ※また、別の方法があるときはぜひおしえてください。

  • ループカウンタを使用せず、配列の全てを足したい

    質問です。 配列を使い、その値の合計値を出す際に私はループカウンタを利用して足す手法を 思いつくのですが、それ以外の方法があると聞きました。 ですが、それ以外の方法が思いつかなく質問させてください。 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int nSum = 0; for ( int i = 0; i < 10; i++ ) { nSum += a[i]; } return nSum; ここでループカウンタを使用せず、配列の全てを足すにはどうしたら良いでしょうか。

  • byte配列の途中から2個ずつintに移すには?

    byte配列の途中から2個ずつintに移すには? Byte[] recvData={02:03:04:05:06:01:00:02:00:FF:FF:05} int nCount; =3;//データn個ください。 List<int> ValueList = new List<int>();//格納用 for (int i = 0; i < nCount; i++) {   //[0]~[4]までヘッダ+サブヘッダ。データは[5]から2byteずつ ValueList.Add(recvData[5 + i * 2] | (recvData[6 + i * 2] << 3)); }; という感じで、溜まったbyte配列の受信データから 0001、0002、65535とデータ部分を2byteずつ取り出したいのですが もうちょっとC#なら簡潔な書き方ってあるのでしょうか?

  • C++ メンバ配列の初期化

    ------------------------------------------- class Myclass {    int array[20]; public:    Myclass() {       for(int i=0; i<20; i++) {          array[i] = 0;       }    } }; -------------------------------------------- ↑のようにするとarrayが初期化ではなく、代入されるそうなんですが、何か良い初期化方法があれば教えてください。

  • C/C++の配列について

    配列の作り方について nは特定の数でarr[3]以降の値をfor文で代入したいのですが 同じfor文で値を代入すると(1)は不正解で(2)が正解になります 小さい数だと見た目は同じで何が違うのか解らないのですが、これは何がちがうのでしょうか? (1)の0, 0, 1以降は全て初期値として0が入ると認識してたのですがそれも違いますか? (1) int arr[n]={0, 0, 1}; (2) int arr[n]; arr[0]=0; arr[1]=0; arr[2]=1; for (int i=3; i<n; i++) { arr[i]=略 } よろしくお願いします

  • 連想配列の初期化

    UNIXでAWKの連想配列を使っています。 連想配列を処理の途中で初期化したいのですが、どうすれば良いのでしょう? とりあえず今は以下のように初期化をしています。 for ( i in a ){a[i]="";} しかし、できれば a=null という感じに一発で初期化をしたいのです。

  • 配列を動的に作成する

    Stringの配列を動的に作成したのですが、 下記のようなコーディングを書くとnullになってしまい、 駄目になってしまいます。 String[] strArr = null; for( int i =0; i < 何かのMax件数; i ++ ){ strArr[i] = new String(); strArr[i] = "ループによって変動する値"; } 何か良い方法はありますか?

    • ベストアンサー
    • Java