1

次の構造体を取得しました。

struct Packet
{
    short PacketSize;
    short Type;
};

struct SizeValidity
{
    short SizeEnc;
};

struct SendEncSecureCode
{
    Packet header;
    short EncSecurityToken;
    int lTime;
    SizeValidity ending;
};

私のコードでは、次のように sizeof 演算子を使用して構造体のサイズを取得したいと考えています。

SendEncSecureCode sendpacket;
sendpacket.header.PacketSize = sizeof SendEncSecureCode;

問題は、0x0C ではなく常にサイズ 0x10 を取得することです。そのため、INT タイプを DWORD に変更しても同じ問題が発生します。後で DWORD32 を試しても同じです。コンパイラは 8 バイトとして設定しています。私はVC11ベータに取り組んでおり、ソフトはx64ではなくx86を目指しています。ありがとう

4

2 に答える 2

3

これはパディングと呼ばれます。コンパイラは、構造体のさまざまなメンバー間のスペースを 0 バイトで埋めて、CPU がより速く読み取ることができるアドレスにメンバーをより適切に配置します。プラグマを使用してpackこの動作をオーバーライドできます (ただし、よほどの理由がない限り、そうすべきではありません) 。

#pragma pack(push, 0)
struct {...};
#pragma pack(pop)

これにより、この構造体のパディングが強制的に 0 バイトになります。周りのゼロを変更できます。

于 2012-07-26T04:49:09.960 に答える
0

期待するサイズを取得するには、コンパイラに 1 バイト パッキングを使用するように指示できます。

#pragma pack(push, 1)
struct Packet
{
    short PacketSize;
    short Type;
};

struct SizeValidity
{
    short SizeEnc;
};

struct SendEncSecureCode
{
    Packet header;
    short EncSecurityToken;
    int lTime;
    SizeValidity ending;
};
#pragma pack(pop)

http://vcfaq.mvps.org/lang/11.htmを参照してください。

于 2012-07-26T04:52:18.327 に答える