3

iOS デバイスで読み取るために、OS X でいくつかのバイナリ データ ファイルを作成しています。次の構造を読み書きしようとしていました。

struct poiStruct {
    double latitude, longitude;
    char titleString[41];
};

sizeof を使用すると、OS X では構造体が 64 バイト、iOS では 60 バイトを占めることがわかりました。

これに関するアイデア/説明は大歓迎です!

4

2 に答える 2

7

違いは要素のサイズではなく、パディングです。OSX では、構造体は 8 バイト境界に整列されるため、

XXXXXXXX double (8 bytes)
YYYYYYYY double (8 bytes)
ZZZZZZZZ char (41 bytes)
ZZZZZZZZ
ZZZZZZZZ
ZZZZZZZZ
ZZZZZZZZ
ZPPPPPPP padding (7 bytes) = 64 bytes

iOS では 4 バイトにアラインされているため、

XXXX double (8 bytes)
XXXX 
YYYY double (8 bytes)
YYYY
ZZZZ char (41 bytes)
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZZZZ
ZPPP padding (3 bytes) = 60 bytes

OS X は 64 アーキテクチャで実行されますが、iOS は ARM6/7 で実行され、32 バイト アーキテクチャであるため、アラインメントは異なる要件です。OS X アプリケーションを 32 ビット モードでコンパイルすると (これは可能ですが、お勧めしません)、この違いはなくなります。

于 2012-11-26T22:44:28.620 に答える
2

Macアプリは64ビットアプリですが、iOSバージョンは32ビットです。違いは、アーキテクチャのさまざまなパディング要件に起因します。具体的には、32ビットでは変数を4バイトで整列させる必要があり、64ビットでは8バイトで整列する必要があるため、コンパイラは構造体の最後に異なる量のパディングを追加します。

于 2012-11-26T22:43:18.487 に答える