回复 50楼 BlueGuy
我觉得超级有用,可是普通教材上都没有
————————————————————————————————人不是我杀的————————————————————————————
那我再说说第一题
先说原则:
为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
所以,我们先抛开一些此处不讨论的限制
1.哪一位的系统(16、32、64和传说中的128)
2.编译器(不一样的编译器有不一样答案)
3.看官来补充...
————————————————————————————偷偷分割下——————————————————————————————————
原则通俗的讲,我认为就是分配结构体各个成员地址的时候,起始地址要是该类型所占用字节的整数倍,从而对齐,举例:
(1)
struct ooxx
{
int a;
char b;
};
sizeof(ooxx) = 5
int占4
char因为本身是占1字节的类型,所以它的起始地址只要是1的倍数即可(哈哈,什么整数都可以嘛),所以给他5咯,所以4 + 1 = 5。
(2)
struct ooxx
{
char b;
int a;
};
sizeof(ooxx) = 8
char占1
那么它下一个就是地址2,因为int占4字节,如以2起始,那么2 + 4 =6,6和4不是整数倍关系,但是也不能使结束地址为4,因为char占据了1,而int又要占4个,起码是大于等于5嘛,所以我们要找的是,大于或等于5的最小4的整数倍数字,
显然可得(加个亮,特别喜欢这4个字):Is 8。
为了让int的结束地址到8的位置上,就要让前面的东东占4字节。所以原来只占1字节的char华丽丽的变身占了4字节(便宜这小子还浪费了内存,不过按原则所述,提高了CPU的存储速度)
———————————————————————————————明目张胆的分割线——————————————————————————
类似的举例不讲了
(3)
struct ooxx
{
int a;
char b;
int c;
};
sizeof(ooxx) = 4 + 4 + 4 = 12;
(4)
struct ooxx
{
char a;
char b;
int c;
};
sizeof(ooxx) = 1 + 3 + 4 = 8或者2 + 2 +4 = 8或者3 + 1 + 4 = 8(我不知道2个char实际该怎么分配,高人来指点)
(5)
打字发现个规律也,按原则来算,
struct占用字节数,必须是最大成员本身占用字节数的整数倍,因为要对齐嘛
(6)
你怎么这样啊?我都举例这么多了,自己出题自己算吧...
吃饭去,bye~~~~