2

フットプリントを最適化したい構造があります。

typedef struct dbentry_s {
   struct dbentry_s* t_next;
   struct dbentry_s* a_next;
   char *t;
   char *a;
   unsigned char feild_m;
   unsigned char feild_s;
   unsigned char feild_other;
} dbentry;

私が理解しているように、コンパイラは、構造を定義するとメモリ内に構造を作成します。そのため、小さな型がアライメント ホールを埋めることができるように、大きな型を最初に宣言する必要があります。

データ構造のアライメントに関する WikiPedia の記事と、この問題に関する他の記事を読みました。 http://en.wikipedia.org/wiki/Data_structure_alignment

しかし、まだ確信が持てません。現在の注文が最適なのか、何か不足しているのでしょうか。

注: 私のコンパイラは「#pragma pack」をサポートしていません

4

2 に答える 2

5

いいえ、一般的なコンパイラの動作に基づいた最適な順序である必要があります (標準では、要素間のスペースに関して構造体がどのようにパックされるかは実際には規定されていないことに注意してください。ただし、順序が指定どおりであることは保証されています。最新ドラフト C1x-n1425 の「6.2.5 タイプ」)。

すべてのポインターが前面にあり、すべての文字が背面にあるため、4 バイトのポインター サイズでは 19 バイトまたは 20 バイトの構造体になることがおそらくわかります。

これは、コードに次の行を挿入することで簡単に確認できます。

printf ("Size of dbentry* is %d\n", sizeof (struct dbentry_s*));
printf ("Size of char*    is %d\n", sizeof (char*));
printf ("Size of uns char is %d\n", sizeof (unsigned char));
printf ("Size of stucture is %d\n", sizeof (dbentry));

私がすべてsizeofチェックを行った理由は、完全な情報を確実に入手できるようにするためです。sizeof(char)が常に 1 であることは十分承知しています。

于 2009-12-20T09:52:23.957 に答える