2011-07-20 9 views
1

例えば、私はこのような構造とコードを有する:このような構造とコード対構造体内の変数にメモリを割り当てる最良の方法は何ですか?

typedef struct 
{ 
long long *number; 
} test; 

test * test_structure; 
test_structure = malloc(sizeof(test)); 
test_structure->number = malloc(sizeof(long long) * 100); 
free(test_structure->number); 
free(test_structure); 

を:

typedef struct 
{ 
long long number[100]; 
} test; 

test * test_structure; 
test_structure = malloc(sizeof(test)); 
free(test_structure); 

iは数値列は、常に100であることがわかっているので、これらの方法のいずれかが完全です受け入れられる、または一方の方法よりも他のより良いです、そしてなぜですか?

答えて

6

第二の方法は、いくつかの理由で優れている:あなたが唯一の割り当てではなく、2つ(メモリリークの減少のチャンスを)解放する必要があり

  1. データ構造内の配列のサイズをコード化しました。これはコード解析に役立ちます。最初のバージョンは任意のサイズを持つことができ、誰も下付き文字が間違っていると言うことはできません。最初の構造体に適切に初期化された 'size'メンバを追加した場合、この引数にはそれほどの力はありませんが、あまり力はありません。
  2. 構造割当を使用して2番目の構造全体をコピーすることができます。同じ方法で最初の構造体をコピーすることはできません。
  3. 生成されたアセンブラは、最初のものと少し異なります(より長いもの)(メンバからアドレスをフェッチしてから、逆参照するのではなく逆参照する必要があります)。

これら2つの方法は実質的に同じです。あなたは最初のものと比べてより多くのスペースを使うことができますが、それは大きな問題ではありません(もしそうであれば、 100とすると、ポインターと配列の間で調整するよりも多くのスペースを節約できます)。

3

私は間違いなく後者に行くでしょう。メモリプロファイルはほぼ同じです。メモリ割り当てが1つだけで、追跡する可動部分が少なくて済むので、前者の代替案を検討する理由はほとんどありません。

実際には、未知の長さの配列であっても、おそらく裸のlong long *の代わりに、値を付け加えているような構造体ラッパーになるでしょう。

0

あなたは配列のサイズを知っているので、私は後者のみを使用します。そうでない場合は、前者です。

関連する問題