C++中类的大小

#include <iostream>
 using namespace std;

 class A{};

 class B
 {
     int b;
     char c;
 };

 class C
 {
     int c1;   
     static int c2;
 };
 int C::c2 = 1;

 class D:public C,public B{
     int d;
 };
 int main()
 {
     cout<<"sizeof(A)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }

分析:

运行结果为:

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


对于类A来说,虽然A是一个空类,但为了便于空类进行实例化,编译器往往会给它分配一个字节,这样A实例化后便在内存中有了一个独一无二的地址.对于类B,B的大小应为sizeof(int)+sizeof(char)=5,但是考虑内存对齐,32位是4字节对齐,B的大小应为8.对于类C,类的静态成员变量被放在全局区,和类的普通成员并没有放在一块。类的静态成员被声明后就已存在,而非静态成员只有类被实例化后才存在。所以C的大小为sizeof(int)=4。D的大小为B+C的大小+自身数据成员的大小,一共为16.

下边考虑有虚函数

不管类中有一个或者多个虚函数 类的大小只增加4字节

类的大小 不考虑成员函数和构造函数和析构函数的大小

类中含有不同成员变量时类的大小

三个规则:

【1】结构体变量的首地址能够被这个变量大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
class A
{
int a;short b,char c;
}//大小为4+2+1,由于第三条规则 股为8,4的整数倍
class B
{
short a;int b;char c;
}//a的大小为2B,所以b的偏移量应该从4开始不应该从2开始,2+4+1,故为12
class B
{
char a;short b;int c;
}//a大小为1,b的大小为2,偏移量要是2的倍数,b的偏移量为2,不应该为1,故2+2+4
class C
{
char b;
short a[10];
int c;
}/2+20+4 故为28,4的倍数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值