c++ 类的大小问题

先看一段代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
struct A
{
	
	double b;
	//int c ;
	double d;
	
	int a;
	int f;
	int t;
	char g;
	char g1;
	char g3;
	int vv;
	char g4;
	//char g5;
};
class X
{
	double i;
public:
	X(){i = 0;};
};
class Y: public X
{
private:
	
	int i;
	//int j;
	X x;
public :
	Y(){ i = 0;}
	
};
class B
{
};

int main()
{
	
	using namespace std;
	cout << sizeof(A) << endl;
	cout << sizeof(X) << endl << sizeof(Y) << endl;
	cout << sizeof(B) << endl;
}


解释:

第一个sizeof(A)的大小是因为内存分配的效率问题, 所以都会以类里面占用字节最大的 基本类型 double 为标准划分, 也就是最后大的的double 的整数倍, 又因为数据是按照在类里面声明的顺序储存的, 所以不够的就当一个double, 所以在A里面a, f占用一个double, t, g, g1, g3占用一个double(即使不够8字节也得占用8字节), 最后v和g4占用一个double, 所以一供就是4个double = 40字节


第二个sizeof(X) 的大小就不解释了就是8


第三个sizeof(Y) 这个大小不好理解, 由于是从x继承过来的, 即使在y中声明了一个和x里面变量相同的变量i, 那么也只是将x继承下来的i给隐藏了, 所以y里面有两个i(一个x的, 一个y的);同时y里面还有一个X 型的x变量, 这个x是占用8个字节的; 综上所述, y里面的int i 和x里面的double i 不是同一个, 所以y里面实际有int i, double i(被隐藏), X x 三个变量, 按照A 的大小规则, 就是三个double,那么结果是24


第四个sizeof(B) 是由于编译器为了区分对象的地址强制给空得类添加一个字节(要是空的就没法开地址空间了, 也就没办法区分对象);






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值