3

我正在 OS X 上编写一些二进制数据文件以在 iOS 设备上读取。我试图读写以下结构:

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

我发现使用 sizeof 该结构在 OS X 上占用 64 个字节,在 iOS 上占用 60 个字节。

对此的任何想法/解释都非常感谢!

4

2 回答 2

7

差异不在于元素的大小,而在于填充,在 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 应用程序(这是可能的,但我不鼓励这样做)应该会使这种差异消失。

于 2012-11-26T22:44:28.620 回答
2

您的 Mac 应用程序是 64 位应用程序,而 iOS 版本是 32 位。不同之处在于架构的不同填充要求,特别是 32 位要求变量对齐 4 字节,而 64 位需要 8 字节对齐,因此编译器会在结构的末尾添加不同数量的填充。

于 2012-11-26T22:43:18.487 回答