2012-11-26 23 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

杰克 - 感谢您的解释......它非常有意义!我现在很灵活,所以我可以更新数据结构,使其落在两种架构的相同路线上。 –

相关问题