我正在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