sizeof浅析(三)——求类的大小

本文深入探讨了C++中sizeof运算符在处理类和继承时的规则。从空类到含有虚函数的类,再到普通继承、虚继承和多重继承的情况,详细分析了类大小的计算方式,包括虚函数表指针的影响和编译器的差异。总结了各种情况下sizeof的结果,并强调了虚继承的意义在于减少内存开销和解决二义性。
摘要由CSDN通过智能技术生成

          sizeof求类的大小和求结构体的大小,有一定的相似性,但又不完全相同,因为类存在这继承和派生、存在着虚函数。

1、空类大小

对于一个空类,使用sizeof求得其大小为1。

2、简单类

如下定义一个类,

class A
{
public:
    int a;
private:
    char b;
};

        使用sizeof求这种简单类,结果和求结构体的sizeof是一样的,需要考虑偏移和对齐。要注意的是static变量不属于类的一部分,如果类中定义了static变量,求sizeof时可以忽略它们。

3、带虚函数的类

        虚函数放在虚表中,类中定义了虚函数,需要存放一个指向虚表的指针。

class A
{
public:
    int a;
    virtual void f(){}
};


        上述代码的sizeof结果为sizeof(A.a)+sizeof(指针)。

当有多个虚函数时,仍然只需要一个指向虚表的指针,因此如下代码的结果和上述代码一样:

class A
{
public:
    int a;
    virtual void f(){}
    virtual void f2(){}
    virtual void f3(){}
};

4、普通继承

class A
{
public:
    int a;
    char b;
};
class B
{
    char c;
};

上述代码结果取决于编译器,比如在Codeblocks中结果为8,这说明将char c和char b放到一起了,而在VS2010中,结果为12。不过对如下代码:

class A
{
public:
    int a;
private:
    char b;
};
class B : public A
{
public:
    int d;
    char c;
	
};
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值