iOS デバイスで読み取るために、OS X でいくつかのバイナリ データ ファイルを作成しています。次の構造を読み書きしようとしていました。
struct poiStruct {
double latitude, longitude;
char titleString[41];
};
sizeof を使用すると、OS X では構造体が 64 バイト、iOS では 60 バイトを占めることがわかりました。
これに関するアイデア/説明は大歓迎です!
違いは要素のサイズではなく、パディングです。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 ビット モードでコンパイルすると (これは可能ですが、お勧めしません)、この違いはなくなります。
Macアプリは64ビットアプリですが、iOSバージョンは32ビットです。違いは、アーキテクチャのさまざまなパディング要件に起因します。具体的には、32ビットでは変数を4バイトで整列させる必要があり、64ビットでは8バイトで整列する必要があるため、コンパイラは構造体の最後に異なる量のパディングを追加します。