c/c++中使用sizeof计算结构体struct和类class的长度(字节)

前言

结构体求sizeof

在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素长度都小于处理器的位数的时候,便以结构体内最长的数据元素为对齐单位,也就是说,结构体的长度一定是最长的数据元素的整数倍。如果结构体内存在的长度大于处理器位数的,那么就以处理器的位数为对齐单位。结构体内类型相同的连续元素,将在练习的空间内,和数组一样。多说无益,直接看程序。

struct {short a1;short a2;short a3;} A;
struct {short a1;long a2;} B;

cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;


大家猜测结果是什么呢?

很多人以为是:6和6

正确答案是:6和8


为什么呢?

结构体A中有三个short类型的变量,各自以2字节对齐,长度为6字节。6是最大长度2的整数倍。故sizeof(A)=6;

结构体B中,long 占用4个字节,short占用2个字节,共6个字节,但是6不是4的整数倍,于是需要补空自己,增到8字节,即sizeof(B)=8

对类求sizeof

关于类,我将以两个例子来说明

列1:
class Student{
	public :
		bool isGirl;
		int age;
		bool beautiful;
};
cout<<sizeof(Student);

结果为:12

列2:
class Student{
	public :
		bool isGirl;
		int age;
		bool beautiful;
};
cout<<sizeof(Student);

 结果:8 
为什么会出现这种情况呢?
解析:这跟内存中数据对齐有关系。
列1对齐方式
|---------bool----------------|---------------------|---------------------|----------------------------|   三个字节用空格填充
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|---------------------|---------------------|----------------------------|   三个字节用空格填充
故12个字节
列2对齐方式
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|----------bool-----------|---------------------|----------------------|   2个字节用空格填充
故8个字节
列3:
class Student{
	public :
		int age;
                static int schoolNum;
		
};
cout<<sizeof(Student)<<endl;
结果:4
解析:因为静态变量式存放在全局数据区的,而sizeof计算栈中分配的大小,所以sizeof(Student)=4

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值