栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

类在堆中的结构 ?(从 成员 成员函数 虚表的指针 考虑)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

类在堆中的结构 ?(从 成员 成员函数 虚表的指针 考虑)

前言

heap和stack在C++标准中相对术语分别是自由存储(free store,即用new创建对象时所分配的空间)和自动变量(automaticvariable,或称局部变量)
从编程的角度,要分开两者,是因为两者的生命周期不一样。
1,自动变量会在作用域(如函数作用域,块作用域)结束后析构释放内存。因为分配和释放的次序刚好完全相反,所以可用到堆栈先进后出的特性。而c++语言的实现一般也会使用到调用堆栈来分配自动变量
2,自由存储可以在函数结束后继续生存,所以也需要配合delete来手动析构,释放内存(也可以用智能指针避免手动delete)。

C++成员函数在内存中的存储方式

(虚指针理解为一个 int64_t* 的数组,每个数组成员都是函数指针)
先说明几点:
空类大小不为 0
静态类成员函数与类绑定,并不会被注入 this 指针因此静态成员函数可以通过类名直接调用,不需要创建类对象。同样因为没有 this 指针,所以静态成员函数也不能调用普通成员函数,只能访问静态成员变量。
普通成员函数为类全局共享,不与类实例绑定但是普通成员函数的调用需要绑定实例,这是因为普通成员函数 this 指针的存在; 也因为普通成员函数绑定的不是类实例,所以普通继承关系不具有多态,而是由指针决定。
虚表为类全局共享,不与类实例绑定; 虚指针与类实例绑定虚表是全局存在的,相当于一个全局变量,而不是每个类实例都创建一个虚表,虚表只能通过虚指针来访问。虚指针在Linux G++/Clang++ 实现是放在类的最前面。虚指针指向虚表的操作由构造函数初始化。
成员函数不占用类的内存空间即 new 一个对象只是创建了对象的数据部分,并不包含函数部分
类的实际内存结构如下:

虚表与虚指针
说明:
虚表指针总是存在在类的头部,并按类的继承顺序排放。一个子类可以有多个虚表指针,且虚指针个数和具有虚函数的基类个数相同。
虚成员函数总是按照声明顺序存在于虚表中。
如果存在同名函数,子类虚函数会覆盖每一个父类的每一个同名虚函数。
子类独有的虚函数填入第一个虚函数表中,且用父类指针是不能调用。
父类独有的虚函数不会被覆盖覆盖。仅子类和该父类指针能调用。
如下图类的内存结构图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384578.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号