C++中类所占内存大小的相关研究

类所占内存大小的研究:

C++中类所占内存大小是和类的非静态成员变量,是否继承,是否是虚继承等因素息息相关的。(下面的讨论是在GCC64位编译器下进行的


空类(没有任何非静态的数据成员)

此时分为没有继承自其他类,直接虚继承于一个类,直接继承于一个类,继承于虚继承得到的子类。

#include<iostream>
using namespace std;
class A{};
class B:virtual public A {};
class C:virtual public A {};
class D:public B,public C{};
class E:public D{};
class F:public A{};
class G:public F{};
int main()
{
    cout<<(sizeof(A))<<endl;
    cout<<(sizeof(B))<<endl;
    cout<<(sizeof(D))<<endl;
    cout<<(sizeof(E))<<endl;
    cout<<(sizeof(F))<<endl;
    cout<<(sizeof(G))<<endl;
    return 0;
}
	}

运行结果为:
在这里插入图片描述
下面给出相关分析,对于上面的A来说,编译器为了便于区分,会安插进去一个char,因此大小为1byte。对于B来说,由于虚继承于A,会有一个虚指针指向虚基类,而指针在该种情况下占了8bytes,故总共为8字节。再来看D,D继承自B,C,首先D有一个被共享的A实例,在该种情况下D继承了B,C,且由上述的分析可以知道B与C中均含有8bytes的虚基类表指针,而D没有成员变量且A,B,C均没有成员变量。故总共占了16bytes的内存。再来看E,由于直接继承于D,又没有任何的成员变量,故所占内存和D相同,为16bytes,而对于F,G,由于A,F,G均没有成员变量,此时就与A的情况一样,会安插一个byte,故所占内存大小为1byte。

含有静态成员的情况

测试代码为:

#include<iostream>
using namespace std;
class A{};
class B:virtual public A {static int y;};
class C:virtual public A {static int x;};
class D:public B,public C{static int x;};
class E:public D{static int x;};
class F:public A{static int x;};
class G:public F{static int x;};
int main()
{
    cout<<(sizeof(A))<<endl;
    cout<<(sizeof(B))<<endl;
    cout<<(sizeof(D))<<endl;
    cout<<(sizeof(E))<<endl;
    cout<<(sizeof(F))<<endl;
    cout<<(sizeof(G))<<endl;
    return 0;
}

此时执行结果为:
在这里插入图片描述
在计算类所占大小时,要注意不要计算静态成员变量所占内存的大小,因为静态变量是存储在静态存储区的!!!

含有非静态成员的情况

测试代码为:

#include<iostream>
using namespace std;
class A{};
class B:virtual public A {int y;};
class C:virtual public A {int x;};
class D:public B,public C{int x;};
class E:public D{int x;};
class F:public A{int x;};
class G:public F{int x;};
int main()
{
    cout<<sizeof(int)<<endl;
    cout<<(sizeof(A))<<endl;
    cout<<(sizeof(B))<<endl;
    cout<<(sizeof(D))<<endl;
    cout<<(sizeof(E))<<endl;
    cout<<(sizeof(F))<<endl;
    cout<<(sizeof(G))<<endl;
    return 0;
}

运行结果为:
在这里插入图片描述
可以看到的是相比较于上述空类时的情况,需要加上相关非静态成员所占内存的大小。


相关总结以及提升

1.只有直接继承虚基类的类才有虚基类表指针,而多级(间接)继承的类没有虚基类表指针。
2.虚基类在其派生类中只有一份实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值