C++类的大小

10 篇文章 0 订阅

目录

0.前言

1.空类

2.普通类

2.1只含变量的类

2.2包含函数

2.2.1普通函数

2.2.2包含虚函数

2.3包含静态成员变量以及函数

 2.3.1包含静态成员变量

2.3.2包含静态函数

3.继承

3.1单一继承

3.2多继承

4.补充

5.总结


0.前言

        本来这个问题是很简单的,但是看了几个博客,嗯~,不能说别人写的不好。反正各有缺点。

        这种情况,我更愿意自己动手。

        先推荐一首歌《黑街》——陈雅雯。

        首先声明一下,我是在64位下计算的哦。


1.空类

        大小不是0。是1。首先要知道空类并不是正的空,肯定含有构造以及析构。至于为什么是1,C++标准的规定。一个独立的对象都必须具有非零大小。

class A{

};

2.普通类

2.1只含变量的类

类型如下

class B {
    char ch;
    int num;
    double n;
};

        大小是16,这个就和结构体的大小一样,字节对齐。

        加上指针,大小变成24。也是一样,字节对齐。

class B {
	double n;
    int val;
    char ch;
    int *p;
};

2.2包含函数

2.2.1普通函数

        如下。大小是24。因为类的大小只与它的数据成员有关,与普通成员函数、构造函数、析构函数无关。

class B {
	double n;
    int val;
    char ch;
    int *p;
    int func(){};
};

        那如果在函数里定义变量呢?

class B {
	double n;
    int val;
    char ch;
    int *p;
    int func(){
		int num;
	};	
};

        一样的,只要是函数里,都无关。还是24。


2.2.2包含虚函数

        看下面这个类的大小。

class B {
    char ch;
    int *p;	
    virtual int func1() {};
    virtual void func2(){};
    virtual int func3(){
    	int n=5;
	};
};

        大小是24。因为虚函数的形成是由一个指针指向虚函数表,所以是一个指针的大小,不论几个虚函数。

        注意:有虚函数的,这个指向虚函数表的指针放在首位置。上面这些代码就相当于

class B {
	
	int *p;	//假设这是指向虚函数表的指针 
    char ch;
    int *p;	
};

2.3包含静态成员变量以及函数

 2.3.1包含静态成员变量

        如下,大小是16。因为静态数据成员保存在全局静态数据区,所以只是看前面三个,字节对齐16。

class B {
    char ch;
    int num;
    int *p;
    static int num2;
};

2.3.2包含静态函数

        大小是24。静态,属于静态区。

class B {
    char ch;
    int num;
    int *p;
    static int num2;
    static void func() {};
    virtual void func2() {};
};

3.继承

3.1单一继承

class A{
	char ch;
	int num;
	int *p;
	
};
class B:public A{
	char cchh;
};

        这样来看B的大小是多少呢?没错24。其实就等价C。

class C{
	char ch;
	int num;
	int *p;
	char cchh;
};

        这个继承对上面的都成立,包括静态,虚函数,都是一样的。

        注意,当基类是空类的时候,此时空类的大小是0。

class A{
}; 

class B:public A{
	int a;
};

        所以B的大小是4。


3.2多继承

        看C的大小多少。

class A{
	char ch;
	int num;
	int *p;
};
class B:public A{
	char cchh;
	static int *pp;
	virtual void func() {};
};

class C:public B{
	int arr[7];
};

        我们先分析到B的大小。B的大小是32,很容易分析出来。然后C继承过来后首先包含32大小。然后是包含数组的大小。相当于7个int型。(注意,有虚函数,相当于在起始位置就是一个指针。)然后字节对齐,即是56。 这个C就相当于。

class C{
    virtual void func() {};          //有虚函数 指针放在起始位置   8
    
    char ch;
	int num;                        //  8
	int *p;                        //   8

    char cchh;                    //8
	static int *pp;
	

	int arr[7];                    //arr[0]与上面char cchh放一起  
                                   //  arr[1]arr[2]   8   3,4--8 5,6--8
};

4.补充

        也是刚遇到的,枚举类型的大小。

enum num{
	one, 
	two,
	three
};

        问sizeof(num)是多大?

        答案是4。


5.总结

        道阻且长。

        长风破浪会有时,直挂云帆济沧海。

        同志们!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值