我正在OS X上編寫一些二進制數據文件以便在iOS設備上讀取。我試圖讀取和寫入的結構如下:OS X和iOS之間的存儲區別
struct poiStruct {
double latitude, longitude;
char titleString[41];
};
我發現使用的sizeof是結構上佔據OS X 64個字節和iOS上的60個字節。
任何想法/解釋在此非常感謝!
我正在OS X上編寫一些二進制數據文件以便在iOS設備上讀取。我試圖讀取和寫入的結構如下:OS X和iOS之間的存儲區別
struct poiStruct {
double latitude, longitude;
char titleString[41];
};
我發現使用的sizeof是結構上佔據OS X 64個字節和iOS上的60個字節。
任何想法/解釋在此非常感謝!
你的Mac App是一個64位應用程序,而iOS版本是32位。不同之處來自體系結構的不同填充要求,特別是32位需要變量爲4字節對齊,而64位需要8字節對齊,因此編譯器會在結構的末尾添加不同數量的填充。
具體是?即使我可以提供這樣的答案:) – 2012-11-26 22:44:05
@ H2CO3 32位需要4字節對齊,而64位需要8字節對齊。這就是爲什麼兩種架構在結構的末端都需要不同數量的填充。 – JustSid
將此寫入您的答案,您將獲得upvote :) – 2012-11-26 22:46:52
差不中元素的大小,但在填充,在OSX結構體被所以它是
XXXXXXXX double (8 bytes)
YYYYYYYY double (8 bytes)
ZZZZZZZZ char (41 bytes)
ZZZZZZZZ
ZZZZZZZZ
ZZZZZZZZ
ZZZZZZZZ
ZPPPPPPP padding (7 bytes) = 64 bytes
,而在它的對準,以4個字節的iOS所以它是
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
對準到8個字節的邊界
由於OS X在64位體系結構上運行,而在ARM6/7上運行的iOS是32位體系結構,所以對齊方式是不同的要求。編譯你的OS X應用程序在32位模式(這是可能的,但我勸阻它)應該使這種差異消失。
傑克 - 感謝您的解釋......它非常有意義!我現在很靈活,所以我可以更新數據結構,使其落在兩種架構的相同路線上。 –
我有一個想法,但不是實際的解釋。不過,我有*解決方案*:'__attribute __((packed))'...... – 2012-11-26 22:43:03