C++ 学习 对象模型之类及对象内存模型

使用C++开发一年多,从今天开始系统性的总结下C++一些知识点,毕竟C++语言特性复杂而庞大,很难短时间全部掌握。

1.类及对象

首先类可以类比C语言的struct结构体,单纯的声明一个类A,如果A没有被实例化,那么A是不会占用内存空间。这里的类可以理解为一种特殊数据结构类型。再来谈谈对象,一个类实例化后就变成一个对象,且对象活跃在内存中。在这里的对象可以理解为C语言的变量。C语言中定义一个结构体变量,就是在内存中开辟一段空间来存储结构体,那么这段内存就是变量。类被实例化,本质也是在内存开辟一段空间来存储类,这段内存空间就叫对象。

2.对象的内存分布模型

C++对象模型已经经过多年的发展,在这里只介绍当前的C++对象内存模型。

class A{

public:

    int a;

    static double b;

    void fun1(){};

    virtual void fun2(){};

    virtual void fun3(){};

 

}

在这里定义了一个类A,那么如果 A a;实例化A生成对象a,那么sizeof(a)是多大呢?

在对象的内存结构中,只有非静态数据成员和指向虚函数表的指针占用对象内存。其中虚函数会被记录在一个虚函数表里面。

由此推断sizeof(a)是8字节,其中只有a和虚函数指针存在于对象内存。

其中静态数据成员是所有对象共享

疑惑:实例化类A产生对象a,这个步骤开辟了多少内存,如果只分配了8字节,那么当对象a调用非静态成员函数时,这些东西内存里面都没有,因此类成员函数一定会被放入内存,那么这个步骤又是什么时候发生的呢?

猜测:每个对象都有自己唯一的非静态成员函数,但这些非静态成员函数不会被放到对象内存布局中,而是被放到了另外一段内存里面,因此实例化类A这个步骤其实并不仅仅开辟了8字节内存,这里只是猜测,后续学习遇到再验证。

最终结论:类的所有含有成员函数包括静态成员函数,在程序载入时都放到了内存代码区,所以以上实例化A内存就分配了8字节。

每个类的成员函数在内存只会存在一份,成员函数都是类似这样A::fun1,下面给出实际调试例子:

反汇编后如下

可以看到不同对象调用相同成员函数,成员函数的地址都是一个。实际上对象再调用成员函数的时候会把this指针传到成员函数中。经过编译器处理后,成员函数可能会被定义成  void A::fun1(A *p) ,这里的p就是this指针,根据这个this指针就可以访问对象其他数据成员。换句话说,我们定义的成员函数,编译器会给我们转换成另一种形式。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值