在C中查找结构的大小
struct student
{
char name;
int age;
float weight;
};
main ()
{
int i,j,k,l;
struct student s1;
i=sizeof(s1.name);
j=sizeof(s1.age);
k=sizeof(s1.weight);
l=sizeof(s1);
printf ("\n size of name %d",i);
printf ("\n size of age %d",j);
printf ("\n size of weight %d",k);
printf ("\n size of s1 %d",l);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:
size of name 1
size of age 4
size of weight 4
size of s1 12
但结构大小应该是其成员大小的总和.为什么我得到12而不是9作为结构变量s1的大小.有人可以解释什么是错的.
出于性能或硬件原因,结构中的字段应适当对齐.阅读有关数据结构对齐的信息(详细信息取决于目标处理器和ABI).
在x86-64/Linux上的示例中:
struct student {
char name;
int age;
float weight;
};
Run Code Online (Sandbox Code Playgroud)
该字段name没有对齐要求.该字段age需要4个字节对齐到4的倍数,该字段 weight需要4个字节对齐到4的倍数
所以整体struct student需要12个字节对齐到4的倍数
如果weight声明double它将需要8个字节对齐到8的倍数,并且整个结构将需要16个字节与8对齐.
顺便说一下,你的name领域类型是错误的.通常名称不止一个char.(我的姓氏需要13个字母+终止空字节,即14个字节).可能你应该声明它是一个指针char *name;(8个字节对齐到8)或一个数组,例如char name[16];(16个字节对齐到1个字节).
在GCC编译器提供了一个很好的扩展:__alignof__和相关类型的属性.
如果性能或大小对您很重要,您应该struct按照降低对齐要求的顺序放置字段(所以通常从double字段开始,然后是long指针等等......)