在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"); }
我的输出是:
size of name 1
size of age 4
size of weight 4
size of s1 12
但结构大小应该是其成员大小的总和。为什么我得到12而不是9作为结构变量s1的大小。有人可以解释什么是错的。
答案 0 :(得分:5)
出于性能或硬件原因,结构中的字段应适当对齐。阅读data structure alignment(详情取决于目标处理器和ABI)。
在x86-64 / Linux上的示例中:
struct student {
char name;
int age;
float weight;
};
字段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 compiler提供了一个不错的扩展程序:__alignof__
和相关的type attributes。
如果性能或大小对您很重要,则应按struct
的顺序将字段放入对齐要求降低的顺序(通常从double
字段开始,然后是long
和指针,等...)