在PC和Arduino的[复制]℃之间的sizeof ++()差(Sizeof() differen

2019-10-16 23:02发布

可能重复: 为什么不和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个字节是从哪里来的?

Answer 1:

其实,我本来期望的大小为4,因为uint16_t通常是对齐到16位。

额外的字节被插入成员之间的填充,以保持对齐uint16_t

这是编译器相关的,但。 Arduino的可能与内存更自私,可能不会很在乎对齐。 (可能的解释)



Answer 2:

这是因为不同的你靶向两个CPU类型之间的ABI的。 好像上的Arduino( ARM V7?)从x86_64的不同。

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

有很多在这方面的信息在x86结构的填充维基百科的文章 。

你可以达到你想要使用什么样#pragma pack指令......但这里是龙,不要告诉任何人我建议吧:)



Answer 3:

如果你在设计一个数据库引擎在移动处理器上运行,然后再进行,但对于大多数别的你写,你的时间将得到更好的花费在使用类型的系统,很容易理解和跨架构相对标准建设的功能。



文章来源: Sizeof() difference between C++ on PC and Arduino [duplicate]