sizeof函数在程序运行阶段执行,sizeof函数的作用是

  sizeof函数在程序运行阶段执行,sizeof函数的作用是

  Sizeof函数函数:计算数据空间中的字节数

  1.请比较strlen()

  Strlen计算字符数组中的字符数,以 \0 为结束判断,不作为 \0 的数组元素计算。

  Zeof计算数据(包括数组、变量、类型、结构等)占用的内存空间。)以字节为单位(当然是用来计算字符数组中的sizeof \0 )。

  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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: