您的位置:首页 > 编程语言 > C语言/C++

[C/C++]_[初级]_[关于C++的虚函数表virtual table的简单说明]

2020-05-10 04:10 921 查看

场景

  1. 在学习
    C/C++
    的时候, 总不免碰到文章内提起虚函数表(virtual table)或者说
    vtbl
    , 还有指向这个
    vtbl
    的指针
    vptr
    ; 问题来了, 到时什么是
    vtbl
    呢? 它的作用是什么?

说明

  1. vtbl
    C++
    对象模型里的概念, 也是目前
    C++
    内存对象里的关键概念, 它主要是用来实现虚函数的寻找问题. 我们都知道虚函数存在的意义主要还是为了继承和多态.
    vtbl
    就是用来查找这些虚函数和
    RTTI
    信息的.

  2. C++对象里主要有这类型数据: 非静态数据成员, 静态数据成员, 静态和非静态函数成员 这4种.

  3. 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

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

Where are member functions stored for an object?

关于C++虚析构函数

infoworld 博客专家 原创文章 347获赞 126访问量 120万+ 关注 他的留言板
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: