我使用的是Linux 32位操作系统, 和GCC编译器。
我尝试了三种不同类型的结构。
在第一个结构中,我只定义了一个char
变量。这个结构的大小是1是正确的。
在第二个结构中,我只定义了一个int
变量。这里结构的大小显示4也是正确的。
但在第三种结构中,我定义了一个char
和一个int
,这意味着总大小应该是5,但它显示的输出是8.任何人都可以解释一下如何分配结构?
typedef struct struct_size_tag
{
char c;
//int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
typedef struct struct_size_tag
{
//char c;
int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
typedef struct struct_size_tag
{
char c;
int i;
}struct_size;
int main()
{
printf("Size of structure:%d\n",sizeof(struct_size));
return 0;
}
输出:
答案 0 :(得分:3)
尺寸的差异是由于对齐。编译器可以自由选择填充字节,这使得结构的总大小不一定是其各个元素的总和。
如果结构的填充是不希望的,因为它可能必须与某些硬件要求(或其他原因)接口,编译器通常支持打包结构,因此填充被禁用。
答案 1 :(得分:2)
您肯定会获得数据结构对齐
“数据对齐意味着将数据放在内存偏移量等于某些值 字大小的倍数,这增加了系统的性能 由于CPU处理内存的方式。为了对齐数据,它可能是 必须在最后一个末尾之间插入一些无意义的字节 数据结构和下一个的开始,这是数据结构 填充“。
有关详情,请查看此Data Structure Alignment
答案 2 :(得分:2)
C标准允许编译器在任何字段之后向结构添加填充字节,以允许根据编译器(或编译器的用户)的任何特定要求对齐以下字段。标准没有指定,但通常编译器将提供命令行参数来指定(默认)对齐。好的编译器也总是支持#pragma pack的事实标准,包括推送和弹出选项。
填充字节通过减少适当对齐的数据类型所需的内存访问量来提高性能。例如,在32位处理器(更具体地说是使用具有32条数据线的存储器的系统)上访问32位整数将在读取和写入值时需要两次存储器访问,而不是仅在跨越4字节时访问一次边界(即,除非整数地址的底部两位为零)。
有关详细信息,请参阅My Blog Post(优于维基百科文章)。
答案 3 :(得分:1)
神奇的词是 填充/内存对齐 @see data structure alignment。