[C/C++]_[初级]_[关于C++的虚函数表virtual table的简单说明]
2020-05-10 04:10
921 查看
场景
- 在学习
C/C++
的时候, 总不免碰到文章内提起虚函数表(virtual table)或者说vtbl
, 还有指向这个vtbl
的指针vptr
; 问题来了, 到时什么是vtbl
呢? 它的作用是什么?
说明
-
vtbl
是C++
对象模型里的概念, 也是目前C++
内存对象里的关键概念, 它主要是用来实现虚函数的寻找问题. 我们都知道虚函数存在的意义主要还是为了继承和多态.vtbl
就是用来查找这些虚函数和RTTI
信息的. -
C++对象里主要有这类型数据: 非静态数据成员, 静态数据成员, 静态和非静态函数成员 这4种.
-
C++对象模型, 以下的截图引用了<< C++对象模型>>里的图
模型1: 单个全属性的C++对象, 注意第一个对象表里只有非静态成员和
vtbl. P10
模型2: 带父类的对象布局, 除了开辟一段区域作为父类的非静态成员用, 还有父类的
vptr也在这个对象内存里. P30
模型3: C++对象的大小 = 非成员函数+
vptr+父类结构+对齐 P102
模型4: C++非静态成员和非静态函数的存储布局,非静态函数是存储在对象之外的, 通过编译器的转换, 会把成员函数转换为非成员函数, 可以说相当于静态函数,参考
Python,类方法的首个参数就是
self该对象. C++也是这么做法. C++规范并没有规定成员函数的布局, 让厂商自己实现. 我们不妨参考 C++成员函数在内存中的存储方式
参考
C++对象模型 (1.1 C++对象模式 The C++ Object Model)
The C++ Programming Language 4th Edition (3.2.2. Abstract Types)
25.4. 2to3 - Automated Python 2 to 3 code translation
Where are member functions stored for an object?
infoworld 博客专家 原创文章 347获赞 126访问量 120万+ 关注 他的留言板相关文章推荐
- 关于C++里的find查找函数的简单说明
- 关于QT/C++中explicit关键字和构造函数的*parent参数的简单说明
- [C/C++]_[初级]_[关于static修饰符的说明]
- [C/C++]_[初级]_[关于static修饰符的说明]
- 关于开源框架GPUImage 的简单说明
- 进程与线程的一个简单解释(目前看到的关于进程和线程说明最好的博文)
- 关于C++中_finite()函数的说明
- 关于野指针,freopen重定向以及cin的简单c++问题
- 关于《C++ primer plus 第六版》中文版的答案说明
- [c/c++]关于volatile关键字的说明以及测试
- 关于Java反射机制中的Field简单尝试与示例以及说明
- 关于C++虚函数表的那些事儿
- OC 中关于block使用的简单举例说明
- 关于开源框架GPUImage 的简单说明
- [C/C++]_[初级]_[关于std::string的compare陷阱]
- 关于自定义View简单说明
- 关于MMU简单说明的一个很好的小文章
- C++项目VS项目目录结构简单说明
- [WTL/ATL]_[初级]_[关于WS_CLIPCHILDREN和WS_CLIPSIBLINGS样式的说明]
- 关于SVN的目录结构 and 使用的简单说明