2011-08-31 16 views
6

の例えば配列[n]と配列[]の違いは?

int array[]={1, 2, 3, 4, 5}; 

と、

int array[5]={1, 2, 3, 4, 5}; 

コンパイラは最初のケースのための自己によって要素の数を計算する必要があり、それはいくつかの時間を取ることができる({...}、の間の任意の差があります1234332534要素)ので、2番目のケースは最初の?

+0

"1234332534要素の配列" - スタックに約4GB(12億ints)を割り当てるのは面倒です。通常のスタックサイズは数メガバイト程度です。それ以外の方法を使用する理由はありません。なぜなら、オーバーヘッドがあると、それはコンパイル時にのみ起こるからです。 – Damon

+4

要素を "カウント"するのに要する時間は、残りのコンパイルとの関係では気づかれません。実際には、2番目の形式でもカウントしなければならないと思います。同じ数の要素を処理します。 'int arr [2] = {1、2、3}; - errm? –

答えて

5

[]の間の明示的な要素数が{}の間のイニシャライザの数と同じである限り、違いはありません。

"効率性"に関する疑問は疑問です。配列サイズはコンパイル時に決定されます。つまり、コードの効率には影響しません。とにかく、コンパイラはいずれにしても初期化リストを解析しなければならないので、コンパイルの効率には実質的な影響はありません。

+2

初期化された要素の数は '[]'の数よりも少なくなることがあります。それ以上あればエラーです。 – wallyk

+0

@wallyk:まあ、数字は同じであるとは言いませんでした。私は言った:*違いがない場合は、数字は同じです。 '[]'の数がそれよりも大きい場合は、余分なデフォルト初期化(またはCでゼロ初期化)された要素の作成が強制されるため、違いがあります。 – AnT

8

この配列宣言:

int array[] = {1, 2, 3, 4, 5}; 

はまったく同じである。

int array[5] = {1, 2, 3, 4, 5}; 

要素の数は、コンパイル時に計算され、その結果、関連付けられたランタイムコストはありません。

最初の宣言の利点は、プログラマが手作業で要素の数を数える必要がないということです。その意味では、より効率的な配列宣言です。

1

プログラマが配列内にいくつの要素があるかを決定する必要はありませんが、違いはありません。コンパイラは、適切な量を割り当てるために要素を数えます。したがって、コンパイラはコンパイル時に同じ長さのコンパイルを行います。

2
  1. 最終結果には違いはありません。それでも、要素を手動で数える必要がないため、最初の書式は書込みと保守が簡単です。
  2. コンパイラはおそらく要素を数えなければならないかもしれません:コンパイルエラーのためにそれが多いかどうかを検出しなければなりませんし、少ない場合はゼロに初期化する必要があります。
  3. とにかく、そのようなカウントはコンパイル時に行われるため、生成された実行可能ファイルのパフォーマンスには何の影響もありません。
  4. 一般に、非常に大きな配列はグローバルスタックとして作成されることはありません(一般的に大きなスタック割り当ては失敗し、大きな配列はグローバルとして実行されるため、膨大な実行可能ファイルとなります))。
  5. そして、たとえあなたが1234332534要素の静的/ローカル配列を受け入れるようにしても、要素の数え方はおそらくこのコンパイルのパフォーマンス上の問題の最後になります。

†。一方で、大きなグローバルアレイとは、バイナリリソースをファームウェアに組み込んで組み込みデバイスにフラッシュする方法です。しかし、私は誰もがこのブルートフォース方法をいくつかのMBよりも大きいものと考えるとは思わない。

+0

+1の#5。 :)(15文字以内) –

0

2番目のケースでは、メモリを初期化するために値が間違っていると、プリコンパイラはエラーをキャッチします。それはかなりです。

+2

本当ではありません。 '[]'の数はイニシャライザのリストのサイズより大きくてもかまいません。この場合、残りの領域はゼロに初期化されると仮定される。 –

+0

配列のサイズより少ない要素を提供することは許され、他の要素はゼロで初期化されます。また、プリコンパイラは実際のコンパイラによって行われます。 –

関連する問題