sizeof计算空间大小的总结

6 篇文章 0 订阅
  1. sizeof(char) :1
    sizeof(int) :4
    sizeof(short) :2
    sizeof(long) :4/8 //32位系统下是4,64位系统下为8
    sizeof(long long) :8 //和编译器有关,如VC6.0下次用法将报错
    sizeof(float) :4
    sizeof(double) :8
    sizeof(long double) :8/16 //32位系统下为8,64位系统下为16

  2. 对指针:char* p; sizeof(p ):4/8 //32位系统下是4,64位系统下为8

  3. sizeof(4+3.14) == sizeof(double) :8

  4. sizeof(“hello”) :6 //在计算字符数组时,sizeof包含’\0’,strlen()不包含’\0’

  5. 对汉字:sizeof(“欢迎”):5/7 //C/C++中一个汉字占两个字节、Linux下3个字节,且字符串尾有空字符’\0’。

  6. 对数组:int a[3];int b[3][4]; //sizeof(a)=sizeof(&a)=12sizeof(b)=sizeof(&b)=48;

  7. 比较重要的一点,关于struct的空间计算
    struct的空间计算比较复杂,总体遵循两个规则:
       1)32位系统环境下,Windows整体空间是占用空间最大的成员(的类型)所占字节的整数倍,在Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空间是4的整数倍即可。
      2)32位系统环境下,数据对其原则——内存结构体成员按先后顺序排列,当排到该成员变量时,其前面已经摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,以此类推。但在Linux+gcc环境下,若成员类型超过4,如double是8,则前面已经摆放的空间大小是4的整数倍即可,不够则补全。
      3) 在 64位系统下,Linux的遵循规则和Windows一致。
      
    成员在内存中摆放时,思路是:
    1、首先把第一个成员放在地址为0的地方
    2、然后再根据第二个成员的类型大小寻找其摆放的起始位置,摆放起始位置必须是类型大小(32位 Linux中 <=4)的整数倍,依次类推。
    3、最后,再计算整体空间是不是最大类型大小(32位 Linux中 <=4)的整数倍。

  8. 含有结构体的结构体的空间计算
    1)在32位环境下,整体空间是子结构体与父结构体中,占用空间最大的成员(的类型)所占字节的整数倍,在Linux+gcc环境下,若最大成员类型所占字节数超过4,如double是8,则整体空间是4的整数倍即可。
    2)在32位环境下,数据对齐原则——父结构体内存按照结构体成员的先后顺序排列,当排到子结构体成员时,其前面已经摆放的空间大小必须是该子结构体成员中最大类型大小的整数倍,不够则补全,以此类推。

    成员在内存中摆放思路(注意32位linux中存在最大为4的对齐限制):
    1、首先把第一个成员放在地址为0的地方
    2、然后再根据第二个成员的类型大小寻找其摆放的起始位置,摆放起始位置必须是类型大小的整数倍,如果是子结构体,则寻找摆放的起始位置是子结构体中最大类型大小的整数倍,依次类推。
    3、最后,再计算整体空间是不是父子结构体中最大类型大小的整数倍。
      Linux+gcc比较省内存,类型大小超过4,起始位置要是4的整数倍即可。

  9. 含有静态成员的结构体
    静态成员的空间不算在结构体空间内。静态成员在程序编译期间就被分配空间到静态存储区。

  10. 含有数组的结构体的空间计算:
    在结构体中,数组是按照单个变量一个一个进行摆放,而不是视为整体,故包含数组的结构体对齐的方式比较特殊。
      以Win32为例:
      struct S1
      {
       char a[8];
       int b;
      };
      sizeof(S1)=12,而不是16。

  11. 使用"#pragma pack"时结构体空间计算
      一般可以通过下面的方法来改变默认条件的对其条件:
      使用伪指令#pragma pack(n),编译器将按照n个字节对齐;
      使用伪指令#pragma pack(),将取消设置的字节对齐方式。
      以上两种指令通常应该搭配使用,和#if #endif类似。
      #pragma pack(n),n为字节对齐数,如果这个值比结构体的sizeof值小,那该成员的偏移量应该以此为准,即结构体成员的偏移量应该取二者的最小值。

  12. 联合union的空间计算
    联合体的sizeof值是所有成员中sizeof的最大值。

  13. 枚举的空间计算
    enum只是定义了一个常量集合,里面没有“元素”,而枚举是当做int类型存储的,故枚举类型的sizeof值为4。

注:
1.但如果一个类拥有虚函数或者虚继承,则在数据成员的基础上相当于多一个指针类型的数据成员(位置在所有数据成员的前面),最后计算时加上即可(虚函数中有一个指向虚函数列表的指针,无论有多少个虚函数都是占用一个字节的大小)。

2.静态(static)成员不在计算范围。

3.如果一个类或者结构体不含有任何数据成员,且无虚函数以及虚继承,则sizeof()结构为1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值