C中结构中的填充量是编译器相关还是定义良好?

C struct的填充量是否在标准或编译器和/或目标体系struct很好的定义。 我在标准中找不到答案。

它是实现定义的。 从C99标准的第6.7.2.1节开始:

…结构或联合对象的每个非位字段成员以适合其类型的实现定义方式对齐…

…结构对象中可能有未命名的填充,但不是在它的开头……

编译器通常会选择适合底层硬件的布局(将内容对齐以便于从内存中读取等)。

填充由实现决定,我们指的是用于编译代码的特定编译器。

在某些平台上,就使用什么填充达成了一致的约定。 这使得不同编译器编译的代码可以实现二进制互操作。

因此,虽然理论上不同的编译器可以做出不同的选择,只要所有代码都在单个进程内运行,不同的填充规则很少成为问题。 另一方面,如果您决定对通过网络发送的数据使用struct布局,那么您将不可避免地遇到问题。 不要将二进制布局结构用于线路上的数据。