c语言中虚函数表偏移量是如何计算的?

2026-04-16 17:093阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计301个文字,预计阅读时间需要2分钟。

c语言中虚函数表偏移量是如何计算的?

我想要问一下,一个类虚拟函数的偏移量决定于什么?我的想法是,从我读过的内容来看,这似乎决定于编译器,但难道不是因为类不同而有所差异吗?

我想问一下,一个类的虚函数表的偏移量取决于什么?我的意思是,从我读过的内容来看它至少取决于编译器,但它是否因类不同而有所不同?

编辑:按偏移量我的意思是表格相对于所有者对象地址的位置.

编辑:示例代码:

void **vtable = *((void***)(((char*)object)+offset)); int **ivtable=(int **)vtable; void* firstFunction = (void*) ivtable[0]; 肯定有依赖于确切的类.

请记住,C具有多重继承(MI). MI的结果是单个对象可能具有多个基础子对象.那些当然不能在同一个地址.这也意味着一些基础子对象实际上并不以相对偏移0开始.

现在,这个MI在vtable中引入了相当多的复杂性:你在不同的偏移量下从多个基础继承函数.因此,为MI类使用不同的vtable布局是很常见的.

c语言中虚函数表偏移量是如何计算的?

在相关的说明中,MI还意味着并非每个指向对象的指针实际上都是指向该对象起点的指针.指向Derived对象的SecondBase *指针很可能被sizeof(FirstBase)偏移,即指向Derived对象中间的某个位置.

本文共计301个文字,预计阅读时间需要2分钟。

c语言中虚函数表偏移量是如何计算的?

我想要问一下,一个类虚拟函数的偏移量决定于什么?我的想法是,从我读过的内容来看,这似乎决定于编译器,但难道不是因为类不同而有所差异吗?

我想问一下,一个类的虚函数表的偏移量取决于什么?我的意思是,从我读过的内容来看它至少取决于编译器,但它是否因类不同而有所不同?

编辑:按偏移量我的意思是表格相对于所有者对象地址的位置.

编辑:示例代码:

void **vtable = *((void***)(((char*)object)+offset)); int **ivtable=(int **)vtable; void* firstFunction = (void*) ivtable[0]; 肯定有依赖于确切的类.

请记住,C具有多重继承(MI). MI的结果是单个对象可能具有多个基础子对象.那些当然不能在同一个地址.这也意味着一些基础子对象实际上并不以相对偏移0开始.

现在,这个MI在vtable中引入了相当多的复杂性:你在不同的偏移量下从多个基础继承函数.因此,为MI类使用不同的vtable布局是很常见的.

c语言中虚函数表偏移量是如何计算的?

在相关的说明中,MI还意味着并非每个指向对象的指针实际上都是指向该对象起点的指针.指向Derived对象的SecondBase *指针很可能被sizeof(FirstBase)偏移,即指向Derived对象中间的某个位置.