sizeof 相关问题

一. sizeof的概念  

  • sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。
  • sizeof操作符以字节形式给出了其操作数的存储大小。

 

二. 64位Linux系统中的sizeof

(指针跟自己的系统有关,32位系统是4个字节,64位是8个字节)

1、char :                   1个字节(固定)
2、*(即指针变量):        8个字节
3、short int :                2个字节(固定)
4、int:                       4个字节(固定)
5、unsigned int :         4个字节(固定)
6、float:                       4个字节(固定)
7、double:                   8个字节(固定)
8、long:                       8个字节
9、unsigned long:       8个字节(变化*其实就是寻址控件的地址长度数值)
10、long long:             8个字节(固定)

 

三. 联合、结构体的sizeof

1、联合union:sizeof是其最大字节成员的字节数

union  u{ 
    char c;
    double d;
}u;

sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

2、结构体struct:sizeof是其成员类型的总字节数,包括补充字节在内

struct a{ 
          char b; 
          double x;
    }a;   
 

在Linux上: sizeof(a) = 12;   而一般sizeof(char) + sizeof(double) = 9; 
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。


但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节, 达到8个,这时候偏移量为8,放上x后长度为16。(VS下是全对齐,16)


在此例中,所有的结构成员都要放在被4整除的地址(Linux的存放方式),这里补3个字节,所以为12。

 

四. 数组的sizeof

当操作数具有数组类型时,其结果是数组的总字节数。
char a[5];
int  b[5];
sizeof(a) = 5;
sizeof(b) = 20;

 

五. 一个类的sizeof

1. 特殊情况:空类

一定不是0,不然我们声明实例的时候,没法使用。空间多大由编译器决定。VS中默认1byte。

 

2. 函数

成员函数的多少,和sizeof的大小是无关的。因为,一个类的成员函数,多个实例也共用相同的函数指针,所以自然不能归为实例的大小。

但是,如果有虚函数。由于存在虚函数表的指针,32位系统上sizeof是4byte,64位系统是8byte。

 

3. 其他数据成员

类似结构体的sizeof规则,包括对齐那些。

 

六. 其他

sizeof(8)    = 4;  //自动转化为int类型

sizeof(8.8)  = 8;  //自动转化为double类型,注意,不是float类型

sizeof("ab") = 3;   //自动转化为数组类型,最后的'\0'符
 

参考文章:

c语言详解sizeof

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值