从64个数中找出16个数,将16个数分成4个小组,要求每个小组数字之和的差最小。
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
意思就是说,结构体如果有嵌套,那么我们把他单独地看作一个变量,对于它的最大对齐数的分析方法依据上述的三个对齐法则,那么这个结构体类型成员的大小就是它本身的大小,对齐数就是它本身的最大对齐数。
还是用例题说话:
struct A
{
char a;
int b;
char c;
}A;
struct B
{
int a;
struct A b;
char c;
};
我们算这个结构体B的大小(注意,它的成员中嵌套了一个结构体A)
我们看结构体B的第一个成员a,它直接对齐到0偏移量处:
第二个成员b,它的类型为struct A,对齐数为4(4是它自己的最大对齐数),大小为12(这个是我们上面分析过的那个结构体,所以直接列出对齐数与大小),所以它的存放位置就是:
最后成员c,由于是char类型,所以对齐数=min{sizeof(char),默认对齐数8}=1,所以——
最终我们得到,这个结构体占据了偏移量为0~16的这17个内存单元,由于成员a,b,c的对齐数分别为4,4,1,所以取最大对齐数为三者的最大值:4,最终我们的结构体B的大小为大于等于17且为4的倍数的最小整数,即:20;
VS编译器下运行:
答案正确!