sizeof函数在程序运行阶段执行,sizeof函数的作用是
Sizeof函数函数:计算数据空间中的字节数
1.请比较strlen()
Strlen计算字符数组中的字符数,以 为结束判断,不作为 的数组元素计算。
Zeof计算数据(包括数组、变量、类型、结构等)占用的内存空间。)以字节为单位(当然是用来计算字符数组中的sizeof )。
2.指针和静态数组的sizeof操作
指针可以被视为一种变量类型。所有指针变量的sizeof运算结果都是4。
例1:char * p;
sizeof(p)=4;
sizeof(* p)=1;//相当于sizeof(char);
示例2:
对于静态数组,sizeof可以直接计算数组大小;
例如:int a[10];
char b[]= hello ;
Zeof (a)等于4 * 10=40;
Zeof (b)等于6;
无效资金(char p[])
{
sizeof(p);//等于4。当一个数组被用作参数时,数组名被用作指针!
}
例3(经典考题):
double *(* a)[3][6];
cout sizeof(a)endl;//4 a是指针
cout sizeof(* a)endl;//72 *a是一个3*6指针元素的数组。
cout sizeof(* * a)endl;//24 **a是数组一维的6个指针
cout sizeof(* * * a)endl;//4 ***a是一维的第一个指针
cout sizeof(* * * * a)endl;//8 * * * a是双精度变量
问题分析:
a是一个奇怪的定义。它意味着指向double*[3][6]类型数组的指针。既然是指针,sizeof(a)就是4。
由于A是double*[3][6]的指针,*a表示double*[3][6]的多维数组类型,所以sizeof(* A)=3 * 6 * sizeof(double *)=72。
同样,**a表示double*[6]类型的数组,sizeof(* * a)=6 * sizeof(double *)=24。
***a表示元素之一,即double*,所以sizeof(***a)=4。
****a,是双精度的,所以sizeof (* * * a)=sizeof (double)=8。
3.格式的编写
Sizeof运算符、变量或对象可以用括号括起来,但如果是类型,就必须用括号括起来。
4.使用sizeof字符串时的注意事项
string s= hello
Zeof (s)等于字符串类的大小(32),sizeof(s.c_str())等于字符串长度(4)。
5.5 .并集和结构的空间计算
一般遵循两个原则:
(1)总空间是占用空间最大的成员(类型)所占用字节的整数倍。
(2)数据对齐原则——数据在内存中按照结构成员的顺序排序。当它排到这个成员变量时,放在它前面的空格必须是这个成员类型大小的整数倍。不够就补上,以此类推。
注意:数组是根据单个变量逐个放置的,而不是作为一个整体。如果成员中有自定义类和结构,也要注意数组问题。
例4:[引用其他帖子的内容]
因为对齐问题使得结构的sizeof变得更加复杂,请看下面的例子:(在默认对齐下)
结构s1
{
char a;
双b;
int c;
char d;
};
结构s2
{
char a;
char b;
int c;
双d;
};
cout sizeof(S1)endl;//24
cout sizeof(S2)endl;//16
它们是相同的两个char类型,一个int类型和一个double类型,但是由于对齐问题,它们的大小不同。元素放置方法可用于计算结构的大小。我举个例子说明一下:首先,CPU判断结构的界限。根据上一节的结论,s1和s2的界限是最大的元素类型,也就是double类型8的界限。然后开始放置每个元素。
对于s1,首先把A放在8的边界上,假设是0。此时,下一个空闲地址是1,但是下一个元素B是double类型。放在8的边界上,离1最近的地址是8,所以B放在8上。此时下一个空闲地址变成16,下一个元素C的边界是4,可以满足,所以C放在16上。这时候,下一个免费地址。由于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的倍数。
这里有个陷阱。对于一个结构中的结构成员,不要认为它的对齐就是他的大小。请看下面的例子:
示例5:
结构s1
{
char a[8];
};
结构s2
{
双d;
};
结构s3
{
S1 s;
char a;
};
结构s4
{
S2 s;
char a;
};
cout sizeof(S1)endl;//8
cout sizeof(S2)endl;//8
cout sizeof(S3)endl;//9
cout sizeof(S4)endl;//16;
虽然s1和s2的大小都是8,但是s1的排列是1,s2是8(double),所以s3和s4有这样的区别。
所以你自己定义结构的时候,如果空间紧张,最好考虑对齐因子来安排结构中的元素。
相关常数:
sizeof int:4
短尺寸:2
长度尺寸:4
浮动大小:4
双倍大小:8
字符大小:1
尺寸p:4
字的大小:2
双字大小:4
转载于:
http://blog.sina.com.cn/s/blog_5c717fa001012ml7.html