3

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

次のように定義された単純な C 構造体があります。

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} LMWinData;

コードの後半で、この型の変数を次のように定義します。

LMWinData   lmWinData;

ここで、この変数のサイズを出力すると、次のようになります。

NSLog(@"data has size of %lu bytes", sizeof(lmWinData));

値 (5 バイト) が期待どおりに取得されません。代わりに 6 バイトのサイズを取得します。

それで、ここで何が問題なのですか?

どうもありがとう!

(Mac OS X Lion を使用しています。)

4

2 に答える 2

3

ここで位置合わせの問題が発生しています。これは、ソフトウェアアクセスの場所を効率的に作成しようとしているコンパイラを扱う場合に注意が必要な問題になる可能性があります。特に、2つの16ビット整数が8ビットに続く構造があり、16ビット整数が奇数の位置から開始します。これは一般に低速です。

ただし、これが必要な場合があり、アライメントとパディングを制御するためのclang/llvmメソッドはです__attribute__((packed))

または、構造で使用するには:

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} __attribute__((packed)) LMWinData;

これは現代のgccでも機能すると思います。

于 2012-06-20T09:55:26.373 に答える
0

構造のパディング、配置を見てください。特定のコンパイラでアラインメントを強制する方法があります。

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} LMWinData __attribute__ ((aligned (1)));
于 2012-06-20T09:50:34.003 に答える