struct a
{
char *c;
char b;
};
sizeof(a)とは何ですか?
#include <stdio.h>
typedef struct { char* c; char b; } a;
int main()
{
printf("sizeof(a) == %d", sizeof(a));
}
32ビットマシンで「sizeof(a)==8」を取得します。構造体の合計サイズはパッキングによって異なります。私の場合、デフォルトのパッキングは4なので、「c」は4バイト、「b」は1バイト、残りは3バイトで次の4の倍数になります。 :8。このパッキングを変更したい場合、ほとんどのコンパイラには、たとえばMSVCで変更する方法があります。
#pragma pack(1)
typedef struct { char* c; char b; } a;
sizeof(a)== 5を与えます。これを行う場合は、ライブラリヘッダーの前にパッキングをリセットするように注意してください。
他の回答のいくつかが言っていることに反して、ほとんどのシステムでは、プラグマまたはコンパイラオプションがない場合、構造体のサイズは少なくとも6バイトになり、ほとんどの32ビットシステムでは8バイトになります。64ビットシステムの場合、サイズは簡単に16バイトになります。アラインメントが機能します。いつも。単一の構造体のサイズは、それらのサイズの配列を割り当てることができ、配列の個々のメンバーが問題のプロセッサに対して十分に整列されるようなものでなければなりません。したがって、他の人が仮定しているように構造体のサイズが5の場合、そのような2つの構造体の配列は10バイト長になり、2番目の配列メンバーのcharポインターは奇数バイトに整列されます。プロセッサ)は、パフォーマンスに大きなボトルネックを引き起こします。
手動でカウントする場合、構造体のサイズは、アライメントを考慮した後の各データメンバーのサイズになります。構造体には魔法のオーバーヘッドバイトはありません。
正確な値はsizeof(a)です。
また、リスクを冒して、この場合は2以上16以下であると想定することもできます。
これは、アーキテクチャと基本的なデータ型の処理方法によって異なります。また、システムが自然な位置合わせを必要とするかどうかにも依存します。
厳密ではなく構造体を意味していると思いますが、32ビットシステムでは、コンパイラが構造体をパディングしているかどうかに応じて、5バイトまたは8バイトになります。
「strict」ではなく「struct」、「Char」ではなく「char」を意味しているのではないかと思います。
サイズは実装によって異なります。ほとんどの32ビットシステムでは、ポインタ用に5〜4バイト、文字用に1バイトになる可能性があります。ここでアライメントが機能するとは思わない。ただし、「c」と「b」を入れ替えると、サイズが8バイトに増える可能性があります。
OK、試してみました(g ++ 4.2.3、-gオプション付き)。8が得られます。
構造体のサイズは32ビットシステムで8バイトである必要があります。これにより、構造体のサイズは2の倍数になります。これにより、構造体の配列が宣言されたときに、個々の構造体が正しいバイト境界で使用可能になります。これは、構造体の最後に3バイトをパディングすることで実現されます。
構造体のcharの後にポインターが宣言されている場合、サイズは8バイトのままですが、ポインター(4バイト要素)を4バイトのアドレス境界に揃えるために、3バイトのパディングが追加されます。
経験則では、要素はバイトサイズの倍数であるオフセットにあり、構造自体は2の倍数であるサイズである必要があります。