c++中sizeof的用法

来源:互联网 发布:建模 软件 数据 开源 编辑:程序博客网 时间:2024/04/30 10:26

1) 作用:sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。

2) sizeof有三种用法形式,( sizeof操作符,对变量或对象可以不加括号,但若是类型,须加括号),如下:

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 1) sizeof( object ); // 对象   
  2. 2) sizeof( type_name ); // 类型   
  3. 3) sizeof object; // 对象  

3)基本数据类型

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. sizeof int : 4  
  2. sizeof short : 2  
  3. sizeof long : 4  
  4. sizeof float : 4  
  5. sizeof double : 8  
  6. sizeof char : 1  
  7. sizeof p : 4  
  8. sizeof WORD : 2  
  9. sizeof DWORD : 4  

注意:定义一个空的类型,里面没有任何成员变量和成员函数,若对该类型求sizeof,那么其结果对于是有编译器决定的,对于VS,每个空类型的实例占用1字节的空间。之所以空类型不包含任何信息还要占用内存,是因为在声明该类型的实例的时候,它必须要在内存中占有一定的空间,以便后续需要使用这些实例。

4) 指针类型:指针记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),在64位系统中指针变量的sizeof结果为8。指针变量的sizeof值与指针所指的对象没有任何关系,因为指针是存放地址的,所有的指针变量所占内存大小相等。

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ex: int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int);    
  2.     char** ppc = &pc; void (*pf)();// 函数指针  
  3.          数组做型参时,数组名称当作指针使用!!  void  fun(char p[])      sizeof(p)等于4  

5)数组:数组的sizeof值等于数组所占用的内存字节数。数组元素个数×数组元素类型所占内存字节数,对于char类型的,是要包括'\0'结束符的。

经典问题: 
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ex: int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int);    
  2.     char** ppc = &pc; void (*pf)();// 函数指针  
  3.          数组做型参时,数组名称当作指针使用!!  void  fun(char p[])      sizeof(p)等于4  
      问题解析: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,就是一个double了,所以sizeof(****a)=sizeof(double)=8 
6)struct
 总体上遵循两个原则:
   (1)整体空间是
占用空间最大的成员(的类型)所占字节数的整倍数
   (2)数据对齐原则---内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小       的整倍数,如果不够则补齐,以此向后类推。。。。。

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. struct s1  
  2. {  
  3. char a[8];  
  4. }; cout<<sizeof(s1)<<endl; // 8  
  5. struct s2  
  6. {  
  7. double d;  
  8. }; cout<<sizeof(s2)<<endl; // 8  
  9. struct s3  
  10. {  
  11. s1 s;  
  12. char a;  
  13. }; cout<<sizeof(s3)<<endl; // 9  
  14. struct s4  
  15. {  
  16. s2 s;  
  17. char a;   
  18. }; cout<<sizeof(s4)<<endl; // 16;  

  s1s2大小虽然都是8,但是s1的对齐方式是1s28double),所以在s3s4中才有这样的差异。 所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。

7)联合体
    结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。结构体的成员也可以是复合类型,这里,复合类型成员是被作为整体考虑的。
    所以,下面例子中,U的sizeof值等于sizeof(s)。
[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. union U  
  2. {  
  3.     int i;  
  4.     char c;  
  5.     S1 s;  
  6. };  

0 0
原创粉丝点击