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