1

重複の可能性:
構造体のsizeofが各メンバーのsizeofの合計と等しくないのはなぜですか?

構造体のサイズがそのメンバーのサイズと等しくないのはなぜですか?それらを減らすために私は何ができますか?私が構造を持っていると言う`

struct a{

int a;
int b[10];
char a;

}

サイズはどうなりますか?

4

4 に答える 4

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

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

構造パディングの方法

于 2012-04-23T09:58:02.480 に答える
0

位置合わせのために構造体メンバーの間に表示される可能性のあるパディングのため。

packed次の属性を使用して、構造体メンバーをgccでパックできます。

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

ストレージの量は少なくなりますが、コードの効率も低下する可能性があります。

于 2012-04-23T09:58:23.350 に答える
0

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

#pragma pack 1
于 2012-04-23T09:58:49.217 に答える
0

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

GCCでは、これをオーバーライドし、packed属性を使用して構造体をパックする(このパディングを削除する)ように要求できます。

struct a
{
    int a;
    int b[10];
    char c;
} __attribute__((packed));
于 2012-04-23T10:01:45.013 に答える