struct S3 {
double d;
char c;
int i;
};
struct S4 {
char c;
struct S3 s3;
int f;
};
int main() {
struct S3 s3;
struct S4 s4;
printf("%d\n", sizeof(s4));
return 0;
}
S4中int f;在下面结果是32,按照理解,第一个char占1个空7个,s3占16个,f占4个?这不是28吗?
简单来讲,S3为什么是16呢?最大的是double占8个字节,还有char(1个字节)、int(4个字节),理论应该是13个字节,但分配空间不会这么分配,一定是最大的double所占空间的整数倍。所以8*2=16个字节,发现够用了。
同理,S4,包含了S3,另外两个char(1个字节)、int(4个字节),理论合起来是size(S3)+5,但实际不会这么分配,一定是较大的空间的整数倍,应该是Size(S3)*2=32,够用了。所以结论是32,就这么简单。
取了地址的内存也如图。
1、没有#pragma pack宏的对齐规则
1.结构体的起始存储位置必须是能够被该结构体中最大的数据类型所整除。
2.每个数据成员存储的起始位置是自身大小的整数倍(比如int在32位机为4字节,则int型成员要从4的整数倍地址开始存储)。
3.结构体总大小(也就是sizeof的结果),必须是该结构体成员中最大的对齐模数的整数倍。若不满足,会根据需要自动填充空缺的字节。
4.结构体包含另一个结构体成员,则被包含的结构体成员要从其原始结构体内部最大对齐模数的整数倍地址开始存储。(比如struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
5.结构体包含数组成员,比如char a[3],它的对齐方式和分别写3个char是一样的,也就是说它还是按一个字节对齐。如果写:typedef char Array[3],Array这种类型的对齐方式还是按一个字节对齐,而不是按它的长度3对齐。
6.结构体包含共用体成员,则该共用体成员要从其原始共用体内部最大对齐模数的整数倍地址开始存储。
C/C++中struct中内存对齐规则 - maji233 - 博客园 前言 先来预热一下,下面两个简单的结构体,假设不在IDE运行测试,你能快速说出输出结果吗?不能,往下看。 发现一直不能快速计算出来,故怒总结本文,否则稍微改变一下结构体又会被蒙圈了,实在不能忍受这种感 https://www.cnblogs.com/maji233/p/11439880.html
所以一定是16的倍数,应该是把char和int堆在一个16里面,structS3堆在第二个16里面,所以最终返回32了