可能重复: 为什么不和sizeof为等于每个成员的的sizeof之和的结构?
在下面的代码,价值structSize
取决于它是否对一个Arduino VS我的电脑(Ubuntu的11.04 x64)的执行是不同的。
struct testStruct{
uint8_t val1;
uint16_t val2;
};
...
uint_8_t structSize = sizeof(testStruct);
在我的电脑,价值structSize
是4,和我的Arduino的价值structSize
是3(如预期)。
这哪里是4个字节是从哪里来的?
其实,我本来期望的大小为4,因为uint16_t
通常是对齐到16位。
额外的字节被插入成员之间的填充,以保持对齐uint16_t
。
这是编译器相关的,但。 Arduino的可能与内存更自私,可能不会很在乎对齐。 (可能的解释)
这是因为不同的你靶向两个CPU类型之间的ABI的。 好像上的Arduino( ARM V7?)从x86_64的不同。
在x86至少, uint16_t
(短)通常对齐到一个两字节的边界。 为了实现这一目标,一个填充字节之后插入val1
。 我希望同样是在x86_64如此。
有很多在这方面的信息在x86结构的填充维基百科的文章 。
你可以达到你想要使用什么样#pragma pack
指令......但这里是龙,不要告诉任何人我建议吧:)
如果你在设计一个数据库引擎在移动处理器上运行,然后再进行,但对于大多数别的你写,你的时间将得到更好的花费在使用类型的系统,很容易理解和跨架构相对标准建设的功能。