2012-11-26 29 views
3

我正在OS X上編寫一些二進制數據文件以便在iOS設備上讀取。我試圖讀取和寫入的結構如下:OS X和iOS之間的存儲區別

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

我發現使用的sizeof是結構上佔據OS X 64個字節和iOS上的60個字節。

任何想法/解釋在此非常感謝!

+1

我有一個想法,但不是實際的解釋。不過,我有*解決方案*:'__attribute __((packed))'...... – 2012-11-26 22:43:03

回答

2

你的Mac App是一個64位應用程序,而iOS版本是32位。不同之處來自體系結構的不同填充要求,特別是32位需要變量爲4字節對齊,而64位需要8字節對齊,因此編譯器會在結構的末尾添加不同數量的填充。

+0

具體是?即使我可以提供這樣的答案:) – 2012-11-26 22:44:05

+0

@ H2CO3 32位需要4字節對齊,而64位需要8字節對齊。這就是爲什麼兩種架構在結構的末端都需要不同數量的填充。 – JustSid

+0

將此寫入您的答案,您將獲得upvote :) – 2012-11-26 22:46:52

7

差不中元素的大小,但在填充,在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位模式(這是可能的,但我勸阻它)應該使這種差異消失。

+0

傑克 - 感謝您的解釋......它非常有意義!我現在很靈活,所以我可以更新數據結構,使其落在兩種架構的相同路線上。 –

相關問題