1

可能重复: 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

在以下代码中, 的值structSize会有所不同,具体取决于它是在 Arduino 还是我的 PC(Ubuntu 11.04 x64)上执行。

struct testStruct{
    uint8_t val1;
    uint16_t val2;
};
...
uint_8_t structSize = sizeof(testStruct);

在我的 PC 上,值为structSize4,而在我的 Arduino 上,值为structSize3(如预期的那样)。

这第 4 个字节来自哪里?

4

3 回答 3

3

实际上,我预计大小为 4,因为uint16_t通常与 16 位对齐。

额外的字节是在成员之间插入的填充以保持uint16_t.

不过,这取决于编译器。Arduino 可能对记忆更加自私,并且可能不太关心对齐。(可能的解释)

于 2012-07-05T14:25:05.080 回答
0

这是因为您所针对的两种 CPU 类型之间的 ABI 不同。似乎在 Arduino(ARM v7?)上与 x86_64 不同。

至少在 x86 上,uint16_t(短)通常与两字节边界对齐。为了实现这一点,在 之后插入一个填充字节val1。我希望在 x86_64 上也是如此。

Wikipedia article on x86 structure padding中有很多关于此的信息。

您可以使用该#pragma pack指令实现您想要的……但是这里是龙,不要告诉任何人我建议的 :)

于 2012-07-05T14:29:11.857 回答
0

如果您正在设计一个在移动处理器上运行的数据库引擎然后继续,但是对于您正在编写的大多数其他内容,您的时间将更好地用于使用易于理解且跨架构相对标准的类型系统来构建功能。

于 2012-07-05T14:46:36.223 回答