構造体のサイズがそのメンバーのサイズと等しくないのはなぜですか?それらを減らすために私は何ができますか?私が構造を持っていると言う`
struct a{
int a;
int b[10];
char a;
}
サイズはどうなりますか?
構造体のサイズがそのメンバーのサイズと等しくないのはなぜですか?それらを減らすために私は何ができますか?私が構造を持っていると言う`
struct a{
int a;
int b[10];
char a;
}
サイズはどうなりますか?
コンパイラーは、構造体メンバー間にパディングを追加して、処理をより効率的にすることができます。そのため、サイズが異なる場合があります。
元:
struct Message
{
short opcode;
char subfield;
long message_length;
char version;
short destination_processor;
};
コンパイラが使用する実際の構造体の定義
struct Message
{
short opcode;
char subfield;
char pad1; // Pad to start the long word at a 4 byte boundary
long message_length;
char version;
char pad2; // Pad to start a short at a 2 byte boundary
short destination_processor;
char pad3[4]; // Pad to align the complete structure to a 16 byte boundary
};
上記の例では、コンパイラはパッドバイトを追加して、ターゲットプロセッサのバイトアラインメントルールを適用しています。上記のメッセージ構造が別のコンパイラー/マイクロプロセッサーの組み合わせで使用された場合、そのコンパイラーによって挿入されたパッドは異なる可能性があります。したがって、同じ構造定義ヘッダーファイルを使用する2つのアプリケーションは、互いに互換性がない可能性があります。したがって、コンパイラやマイクロプロセッサのいずれかが異なるマシン間のインターフェイスで共有されるすべてのC構造体にパッドバイトを明示的に挿入することをお勧めします。
位置合わせのために構造体メンバーの間に表示される可能性のあるパディングのため。
packed
次の属性を使用して、構造体メンバーをgccでパックできます。
struct a {
int a;
int b[10];
char a;
} __attribute__((packed));
ストレージの量は少なくなりますが、コードの効率も低下する可能性があります。
gccコンパイラでは、メモリは4バイトのチャンクに分割されます。したがって、構造体のサイズは48になります。charは1バイトしか使用しませんが、最後の3つが埋め込まれる4バイトが提供されます。プラグマディレクティブを使用して、このパディングを削除できます。使用するだけ
#pragma pack 1
CおよびC++コンパイラは、パディングを使用して構造体メンバーを(通常は)4バイト境界に揃えます。これにより、32ビットプロセッサでより効率的にアクセスできるようになります。
GCCでは、これをオーバーライドし、packed属性を使用して構造体をパックする(このパディングを削除する)ように要求できます。
struct a
{
int a;
int b[10];
char c;
} __attribute__((packed));