2012-04-23 4 views

答えて

0

gccコンパイラでは、メモリは4バイトのチャンクに分割されます。したがって、構造体のサイズは48になります。charには1バイトしかかかりませんが、最後の3つがパディングされるところに4バイトが与えられます。プラグマディレクティブを使用すると、このパディングを削除できます。

#pragma pack 1 
+0

ありがとう:あなたはこれをオーバーライドして、構造体がをパックするように要求できGCCで

はpacked属性を使用して(削除このパディングを持っています)。プラグマを使用した後、私は期待される結果を得ています。 –

1

コンパイラは、サイズが異なる場合があります理由ですその処理をより効率的にするために、構造体のメンバー間のパディングを追加するために許可されている

例:コンパイラで使用される

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 
}; 

上記の例では、コンパイラはpadバイトを追加しましたターゲットプロセッサのバイトアライメント規則を強制する。上記のメッセージ構造が異なるコンパイラ/マイクロプロセッサの組み合わせで使用された場合、そのコンパイラによって挿入されたパッドは異なる可能性があります。したがって、同じ構造定義ヘッダーファイルを使用する2つのアプリケーションは、互いに互換性がない可能性があります。 したがって、コンパイラおよび/またはマイクロプロセッサのいずれかが異なるマシン間のインターフェイスで共有されるすべてのC構造にパッドバイトを明示的に挿入することをお勧めします。

How structure padding done

0

のでためアラインメントの構造部材の間及び後に現れることができるパディング。

あなたはpacked属性を使用してgccで構造体メンバをパックすることができます:ストレージの

struct a { 
    int a; 
    int b[10]; 
    char a; 
} __attribute__((packed)); 

量は少なくなりますが、コードはまた、潜在的に効率が悪くなります。

0

CおよびC++コンパイラは、構造体メンバを(通常は)4バイト境界に整列させるためにパディングを使用します。これにより、32ビットプロセッサでより効率的にアクセスできるようになります。

struct a 
{ 
    int a; 
    int b[10]; 
    char c; 
} __attribute__((packed));