4

スニペットは次のとおりです。

#pragma pack(4)
struct s1
{
    char a;
    long b;
};
#pragma pack()

#pragma pack(2)
struct s2
{
    char c;
    struct s1 st1;
};
#pragma pack()


#pragma pack(2)
struct s3
{
    char a;
    long b;
};
#pragma pack()

#pragma pack(4)
struct s4
{
    char c;
    struct s3 st3;
};
#pragma pack()

sizeof(s4)は10または12である必要がありますが、8であることがわかりました。VisualC++6.0を使用しています。誰かが理由を教えてもらえますか?

4

4 に答える 4

2
#pragma pack(2)
struct s3
{
    char a;
    long b;
};
#pragma pack()

したがって、のパッキングアライメントs3は2であり、そのサイズは1(アライメント1)+ 1(パディング)+ 4(アライメント2)=6です。

#pragma pack(4)
struct s4
{
    char c;
    struct s3 st3;
};
#pragma pack()

のパッキングアライメントs4は4で、サイズは1(アライメント1)+ 1(パディング)+ 6(アライメント2)=8です。

#pragma packより緩い位置合わせ要件では、何も「余分に位置合わせ」しないことに注意してください。アラインメントを減らすだけです。つまり、「パッキング」アラインメントを制御します。

于 2012-11-26T05:07:26.140 に答える
1

のドキュメントに#pragma pack(n)は、「メンバーの配置は、nの倍数またはメンバーのサイズの倍数のいずれか小さい方の境界になります」と記載されています。しかし、これは間違っていると思います。ドキュメントには、メンバーの配置は、nの倍数またはメンバーの配置要件のいずれか小さい方の境界上にあると記載されている必要があります。

のアライメント要件struct s3は2です(#pragma pack(2)宣言されたときに有効であるため)。したがって、有効な構造体でも2の配置になり#pragma pack(4)ます。したがって、のレイアウトはstruct s4次のようになります。

 char c;
 char padding;      // for alignment of the `struct s3`
 char s3.a;
 char s3.padding;   // for alignment
 long s3.b;

合計サイズ==8。

于 2012-11-26T05:22:59.613 に答える
0

s3char(1)+ long(4)= 5-> 6(パック)

s4char(1)+ struct s3(6)= 7-> 8(パック)

実際にどのように機能するかはわかりません#pragma packが、これは妥当なようです。

于 2012-11-26T05:05:07.403 に答える
0

これは、MichaelBurrが言ったことを確認します。

#include <stdio.h>

#pragma pack(push, 2)
struct s3
{
    long b;
};
#pragma pack(pop)

struct s4
{
    char c;
    struct s3 st3;
};

int main() {
    printf("%lu, %lu\n", sizeof(s3), sizeof(s4));
    return 0;
}

出力:4、6

于 2012-11-26T05:41:28.160 に答える