double* (*a)[3][6];
cout<
cout<
cout<
cout<
cout<
使用sizeof时string的注意事项
string s="hello";
sizeof(s)等于string类的大小,sizeof(s.c_str())得到的是与字符串长度。
union 与struct的空间计算
总体上遵循两个原则:
(1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数
(2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。。。。。
注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
例:
因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)
- struct s1
- {
- char a;
- double b;
- int c;
- char d;
- };
- struct s2
- {
- char a;
- char b;
- int c;
- double d;
- };
cout<
对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素b是double类型,要放到8的对界上,离1最接近的地址是8了,所以b被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素b需要对界1,也正好落在对界上,所以b放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。
对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。
这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小
- struct s1
- {
- char a[8];
- };
- struct s2
- {
- double d;
- };
- struct s3
- {
- s1 s;
- char a;
- };
- struct s4
- {
- s2 s;
- char a;
- };
cout<
cout<
cout<
s1
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。