【发布时间】:2018-11-11 22:44:36
【问题描述】:
该标准似乎没有对结构成员施加任何填充要求,即使它does prohibit reordering (6.7.2.1p6)。 C 平台不进行最小填充的可能性有多大,即不只添加确保下一个成员(或同一结构的实例,如果这是最后一个成员)足够对齐所需的最小填充量输入?
标准不要求填充最小是否明智?
我问是因为缺少填充保证似乎阻止我将序列化对象可移植地表示为结构(即使我将自己限制为仅uint8_t 数组作为成员,编译器似乎被允许在两者之间添加填充他们),我发现不得不在那里使用偏移算术有点奇怪。
【问题讨论】:
-
序列化一直是 C 语言中的一个难题。如果您将自己限制为
uint8_t,那么只需使用数组即可。如果你不这样做 - 最小的填充将无济于事。 -
确实,标准没有指定任何关于填充的要求,编译器可能会或可能不会应用填充,但几乎每个编译器都有一个选项(pragma 或属性)来防止特定数据类型的填充.通常称为pack,即:
pack(1). -
@Groo 是的,这不是一个很好的、无需猜测的问题。但至少 cmets 帮助我了解了一些事情(谢谢大家!)(我以前从来不需要跨网络序列化结构,在我做的事情中它只是边缘重要的——让它完整,这意味着我不想花太多时间研究它)。我将简单地做到这一点(偏移量)。
-
达尔文解决了这个问题。一个能解决这个问题的编译器不会很受欢迎。他们没有。
-
@Mawg:我敢打赌这里有些成员根本不希望讨论这样的问题。我不认为这是任何公司的草皮或任何人的拖钓,只是人们对他们真正更愿意考虑违反福音的概念和问题感到不确定/不舒服。我希望我的回答会因为类似的原因而获得相当多的反对票(更多!),并且也会因为他们的努力而谴责微软。 C 标准委员会。