我正在OS X上编写一些二进制数据文件,以便在iOS设备上阅读。我试图阅读并编写以下结构:
struct poiStruct {
double latitude, longitude;
char titleString[41];
};
我发现使用sizeof结构在OS X上占用64个字节,在iOS上占用60个字节。
对此的任何想法/解释都非常感谢!
答案 0 :(得分:7)
差异不是元素的大小,而是填充,在OSX上,struct被对齐到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架构上运行,而在ARM6 / 7上运行的iOS是32字节架构。以32位模式编译你的OS X应用程序(这是可能的,但我不鼓励它)应该会让这种差异消失。
答案 1 :(得分:2)
您的Mac App是64位应用程序,而iOS版本是32位。差异来自架构的不同填充要求,特别是32位要求变量为4字节对齐而64位需要8字节对齐,因此编译器将在结构的末尾添加不同数量的填充。