如何在C结构中计算填充
虽然我了解填充通常如何在C结构中工作,但我很难理解内部结构是如何填充的。例如:如何在C结构中计算填充,c,struct,C,Struct,虽然我了解填充通常如何在C结构中工作,但我很难理解内部结构是如何填充的。例如: struct inner { int a; } struct outer { char a; struct inner b; } 如何计算成员outer.a和成员outer.b之间的填充 当成员inner.a的数据类型从int更改为short或double时,如何计算结构outer结尾的填充 与64位体系结构相比,在32位体系结构中计算这些填充的含义是什么?我总是发现最好是将这些内容转储并进行
struct inner
{
int a;
}
struct outer
{
char a;
struct inner b;
}
如何计算成员outer.a
和成员outer.b
之间的填充
当成员inner.a
的数据类型从int
更改为short
或double
时,如何计算结构outer
结尾的填充
与64位体系结构相比,在32位体系结构中计算这些填充的含义是什么?我总是发现最好是将这些内容转储并进行处理,以便更好地理解。以下是您案例的一个示例:
请参阅,这是否回答了您的问题?除了极少数非常特殊的情况(例如,当您需要使用assembler访问这些结构成员时),您应该避免任何需要特定知识的构造。即使您需要,也应该让编译器执行所需的决定(使用
offsetof()
宏),而不是自己尝试执行。@truthseek似乎struct outer
的成员在您的代码段中(错误地)颠倒了。另外,如果structinternal
的成员a
从int
更改为short
或double
,会发生什么情况。那么填充数字是什么呢?填充是特定于实现的,这意味着每个实现可能有不同的填充,这意味着它取决于编译器。每个编译器可以插入不同(或相同)的填充,并且可以以不同的方式计算填充。C标准没有指定如何计算填充,只是说它是实现定义的。实现定义了如何计算填充。因此,您必须指定您心目中的编译器,然后有人可以找到该编译器计算填充的源代码。