6

例として次のコードを作成しました。

#include <iostream>

struct class1
{

    uint8_t     a;
    uint8_t     b;
    uint16_t    c;
    uint32_t    d;
    uint32_t    e;

    uint32_t    f;
    uint32_t    g;
};

struct class2
{

    uint8_t     a;
    uint8_t     b;
    uint16_t    c;
    uint32_t    d;
    uint32_t    e;

    uint64_t    f;
};

int main(){
    std::cout << sizeof(class1) << std::endl;
    std::cout << sizeof(class2) << std::endl;
    std::cout << sizeof(uint64_t) << std::endl;
    std::cout << sizeof(uint32_t) << std::endl;
}

版画

20
24
8
4

したがって、1 つの uint64_t が 2 つの uint32_t と同じ大きさであることを確認するのはかなり簡単です。uint64_t を 2 つの uint32_t に置き換えることを除いて同じである場合、なぜクラス 2 には 4 バイト余分にあるのでしょうか。

4

3 に答える 3

5

指摘されたように、これはpaddingによるものです。

これを防ぐには、

#pragma pack(1)

class ... {

};
#pragma pack(pop)

8 バイトではなく 1 バイトに揃えるようにコンパイラに指示します。pop コマンドはそれをオフにします (これは非常に重要です。ヘッダーでそれを行い、誰かがあなたのヘッダーをインクルードすると、非常に奇妙なエラーが発生する可能性があるためです)。

于 2014-10-15T11:22:26.797 に答える