2

次のコード。

struct s1 {
    void *a;
    char b[2];
    int c;
};

struct s2 {
    void *a;
    char b[2];
    int c;
}__attribute__((packed));

s1サイズが 12 バイトでサイズが 10 バイトの場合s2、これはデータが 4 バイトのチャンクで読み取られ、サイズが2 バイトだけ}__attribute__((packed));に縮小されるためですか?void*a;

何が何をするのか少し混乱して}__attribute__((packed));います。

どうもありがとう

4

3 に答える 3

2

Intel プロセッサでは、32 ビットで整列されたデータのフェッチは、整列されていないデータよりもかなり高速です。他の多くのプロセッサでは、アラインされていないフェッチは完全に違法であるか、2 つの命令を使用してシミュレートする必要があります。したがって、最初の構造は、cこれらの 32 ビット アーキテクチャでは常に 4 で割り切れるバイト アドレスにアラインされます。ただし、これにはストレージで 2 バイトが浪費される必要があります。

struct s1 {
    void *a;
    char b[2];
    int c;
};

// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | NA | NA | c0 | c1 | c2 | c3 |
// addresses increasing ====>

一方、アラインされていないデータ構造 (ファイル形式やネットワーク パケットなど) をそのまま C 構造にマップする必要がある場合もあります。そこで、 を使用して、__attribute__((packed))バイトをパディングせずにすべてが必要であることを指定できます。

struct s2 {
    void *a;
    char b[2];
    int c;
} __attribute__((packed));

// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | c0 | c1 | c2 | c3 |
// addresses increasing ====>
于 2013-08-13T11:19:23.390 に答える