Bathshebaが述べたように、コンパイラが構造体をどのようにパッドするかは、標準によって決まりません。それは、起こっている可能性の高いことがここにあります。
特定のタイプの変数は、そのアドレスがそのタイプのサイズの倍数になるように配置する必要があります。したがって、2バイトの変数は2バイトのアドレスで開始する必要があり、4バイトの変数は4バイトのアドレスなどから開始します。struct
の場合、配置は最大の「ベース」タイプのものです。配列の場合は、配列全体ではなく、基本型のサイズです。
struct S1
には、char
と、それに続くint
があります。 int
が4バイトであるとすると、それはc
とi
の間に3バイトのパディングが必要であることを意味します。だから、暗黙のパディングを持つ構造体は次のようになります。
struct S1
{
char c; // offset 0
char padding[3]; // offset 1
int i; // offset 4
};
これは私たちsizeof(struct S1) == 8
を与えます。
struct S3
には、struct S1
というインスタンスがありますが、これは8バイト(ただし4バイトのアライメントがあります)とdouble
で、おそらく8バイトです。したがって、それらが正しく整列されるためには、c1
の後に3バイトのパディングが必要であり、次にs
の後に4つのパディングが必要です。だから今、暗黙のパディングとstruct S3
は次のようになります。
struct S3
{
char c1; // offset 0
char padding[3]; // offset 1
struct S1 s; // offset 4
char padding[4]; // offset 12
double c2; // offset 16
};
私たちは、その後、sizeof(struct S3) == 24
を持っています。
このようなパディングスキームは、あなたが遭遇する可能性が最も高いものですが、この規格では保証されません。
なぜ 'offsetof(struct S3、s)'を使わないのですか? – EOF
@EOF私はこの価値を得る方法を知っていますが、その原則はわかりません。コンピュータはS1のオフセットをどのように決定するのですか?ルールはありますか? – HuangJie
なぜオフセットを知りたいのですか? – fukanchik