Cの配列の長さはどのように決定されますか?


ベストアンサー

何を求めているのかは少し不明確ですが、問題は配列が与えられていることだと思います、その長さをどのように決定しますか。

Cには、サイズが不明な配列、一定サイズが既知の配列、可変長配列など、いくつかの種類の配列があります。

の配列の場合一定のサイズ、サイズはその型の一部です。型がint[10]である配列の長さは、非常に10です。Cには、型から直接抽出するメカニズムがありません(C ++とは異なります)。 )、ただし、sizeofを使用して間接的に実行できます:

int a[] = {1,2,3,4,5,6,7,8,9,0};

size\_t sz = sizeof a / sizeof *a; // or .../sizeof a[0], same thing

printf("size = \%zu\n", sz);

可変長配列のサイズは、同じコードでsizeofを使用して計算することもできます。その場合、実行時に実行されます:

scanf("\%d", &x);

int a[x];

size\_t sz = sizeof a / sizeof *a;

printf("size = \%zu\n", sz);

最後に、未知の境界の配列には、定義上、サイズは不明です。プログラムロジックを介して取得する必要があります

extern int a[];

size\_t sz = something\_from\_the\_module\_that\_defines\_a();

もちろん、Cの裸の配列を関数に渡すことはできないため、サイズは呼び出し側で計算して個別に渡す必要があります。

void f(int *a, size\_t sz);

int a[] = {1,2,3,4,5,6,7,8,9,0};

f(a, sizeof a / sizeof *a);

もちろん、メンバー配列は値で関数に渡すことができます:

struct a10 {int a[10];};

void f(struct a10 s) {

size\_t sz = sizeof s.a / sizeof *s.a;

}

回答

主な質問は、複数回検索することですか?もしそうなら、ハッシュテーブルまたは他のインデックスを一度作成して、物事をすばやく見つけます。ハッシュテーブルは、データがディスクから読み取られると同時に生成される可能性があります(それが元の場所である場合)。

これが1回限りのことであり、データがディスクからロードされる場合は、検索はIOと重複していました。 2つ以上のバッファを使用できます。

もう1つの質問は、何かが存在するかどうかを知りたいだけですか、それとも取得したい関連データがありますか。数値が存在するかどうかを知りたいだけの場合は、ビット配列を使用してよりコンパクトな表現を行うことができます。

それ以外に、最速の比較を使用するインラインCコードが最適です。コンパイラが提供するすべての最適化オプションを使用します。一部のコンパイラは、ポインタ、カウンタ、またはインデックスを使用するかどうかに関係なく、同じ高速コードを生成する場合があります。

int * first = ..., * last = ...;

for ( ; first <= last; ++first ) if ( *first == target ) ...

または

int * first = ..., count = ...;

for ( ; count-- > 0; ++first ) if ( *first == target ) ...

または

int * first = ..., count = ..., index = ...;

for ( ; index < count; ++index ) if ( first[index] == target ) ...

コンパイラにアセンブラソースを出力して何をしているのかを理解するように依頼するのは不正だと思うかもしれませんが、パフォーマンスが本当に心配な場合は、Cコードがどのような形式で生成されるかを確認するためだけに、コンパイラが少ない場合はそれが必要になることがあります。最良の結果。

次に、複数のスレッドを使用するなど、他にできることがあります。8つのコアが使用可能な場合、アレイを8つのセクションに分割し、セクションごとにスレッドを起動できます。ただし、比較コストが低い場合、スレッドの開始コストが高すぎる可能性があります。

配列が大きい可能性があるため、仮想メモリのスワッピングによって処理速度が低下する可能性があります。独自のメモリマップファイルバッキングを使用すると、マッピングとマッピング解除を自分で制御して、物理メモリ使用量を低く抑えることができる場合があります。検索を終えたばかりのセクションのマップを解除して、メモリを後のセクションで使用できるようにすることができます。

いくつかのアイデア。頑張ってください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です