类中普通函数,虚函数,成员变量互相存在时的内存占用

本文以最简洁的方式了解不同情况下类中内存的占用

直接定义七个类:

A中包含普通函数,虚函数,两个int类型成员变量和一个char型成员变量;

B中包含普通函数,成员变量(成员变量与A一致);

C中只包含普通成员函数;

D中只有成员变量;

E中只有虚函数;

F中包含普通函数,虚函数;

G中包含虚函数,成员变量。

class A{
public:
    void add1(){cout<<"add1"<<endl;}
    virtual void add2(){cout<<"add2"<<endl;}
private:
    int a,b;
    char c;
};
class B{
public:
    void add3(){cout<<"add3"<<endl;}
private:
    int a,b;
    char c;
};
class C{
public:
    void add4(){cout<<"add4"<<endl;}
};
class D{
private:
    int a,b;
    char c;
};
class E{
public:
    virtual void add5(){cout<<"add5"<<endl;}
};
class F{
public:
    void add6(){cout<<"add6"<<endl;}
    virtual void add7(){cout<<"add7"<<endl;}
};
class G{
public:
    virtual void add8(){cout<<"add8"<<endl;}
private:
    int a,b;
    char c;
};

对七个类sizeof的输出如下:

只有成员变量时大小sizeof(D):12
成员变量和普通函数的大小sizeof(B):12
只有普通函数的大小sizeof(C):1
只有虚函数大小sizeof(E):4
虚函数和普通函数的大小sizeof(F):4
虚函数、普通函数、成员变量大小sizeof(A):16
虚函数和成员变量大小sizeof(G):16

       对比观看可以知道,由于内存中数据对齐,成员变量的大小为12。B类的大小也是12,显然此时系统没有计算普通函数的大小,实际上在内存中普通成员函数是不占内存空间的,但是可以看到C类的大小为1,这又是为什么呢?在C++中,类中只有普通函数的情况下,由于类是可以实例化的,内存需要分配一个内存地址来区分该实例化。对于虚函数会建立一个虚函数表,对应的内存中会有一个虚函数指针vptr占用4字节。

实际上对于内存的占用有什么其他不懂的可以直接上代码输出结果就一目了然了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值