虚表如何存储的,和类或是对象如何关联上的?

rageliu 2014-08-27 10:09:32
在com那边问过,貌似那边人不太多。来这问问

照我平时的理解,如果DLL里存在有虚函数的类(比如平时我们接触的com),那么在编译的时候,会生成一个对应的虚表,里面有虚函数的地址。在实例化对象的时候,构造函数读取前面这个虚表里的内容,给对象本身自己的虚表做初始化。当然也可能对象不生成自己的虚表,只是虚表指针指向前面生成的那个虚表就可以了。这2种情况都是存在的。

目前的疑问是:编译时候生成的虚表,存储在什么位置,代码段?还是其他段?
存储的结构是什么样子的呢,它是如何和类关联上的?(类名? id?或是什么?)

做了个实验,发现确实有类名的信息生成,不过具体的如何关联没弄明白,有熟悉虚表的存储结构方面的资料的朋友给解释解释吗?拜谢。
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
我喝多了 2014-08-30
  • 打赏
  • 举报
回复
如果类中有虚函数, 那么编译时, 类中的第一个成员永远是虚表指针, 保存所有虚函数的指针. 此时类中就算一个成员变量都没有, 大小也是4个字节 如果类中没有虚函数, 编译时就不会产生虚表 指针, 类中也没有这个成员. 此时类中如果没有成员变量, 那么大小就是0字节
fronz 2014-08-27
  • 打赏
  • 举报
回复
这个问题和各编译器运行机制相关。 VC编译器似乎是将其放在在常量数据段。unix体系中是存放在可执行代码中的只读部分。 这是我的印象。 要找相关的官方资料应该向介绍C++代码的编译方法的书,这个方向找
  • 打赏
  • 举报
回复
引用 2 楼 rageliu 的回复:
[quote=引用 1 楼 akirya 的回复:] 重复发了? 只读数据,可以认为是一个只读的全局变量,比如叫class_XXXX_vtbl 构造函数中取这个全局变量地址,赋值给虚表指针。
多谢回复。可能是这样的。请问看到过官方的或是相关的资料吗,我查了下,一直没找到这块的什么资料说明[/quote] C++标准委员会没有规定,虚表这种东西。 所以 虚表相关的都是各个编译器自己实现的,但方法基本都一致。 有兴趣的话可以看看《深度探索c++对象模型》
rageliu 2014-08-27
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
重复发了? 只读数据,可以认为是一个只读的全局变量,比如叫class_XXXX_vtbl 构造函数中取这个全局变量地址,赋值给虚表指针。
多谢回复。可能是这样的。请问看到过官方的或是相关的资料吗,我查了下,一直没找到这块的什么资料说明
  • 打赏
  • 举报
回复
重复发了? 只读数据,可以认为是一个只读的全局变量,比如叫class_XXXX_vtbl 构造函数中取这个全局变量地址,赋值给虚表指针。

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧