首页 > 编程知识 正文

虚函数表存在什么位置(虚函数,虚函数指针,虚函数表在内存的分布)

时间:2023-05-05 11:50:58 阅读:123947 作者:4841

在c中,对于不包含虚函数的类,其大小是变量的大小,是不包含在类中的非虚函数。

case 1:类包含变量class base1{ public : int base1_ 1; int base1_2; //void foo () }; 例如对Base1来说,foo )函数的有无、sizeof ) Base1)的大小都是8,表示类自身的函数不计入类的大小,其实也是合理的。 例如,即使定义了10个Base1,这10个Base1也可以通过使用相同的方法大大节省类占用的内存。

case 2:指向类的函数指针class base2{ public : int base1_ 1; int base1_2; void(*foo ) ); (; 对Base1来说,他的大小为16,是一个比Base1多8字节的函数指针。

case 3(类中有一个或多个虚函数classbase3) public:intbase1_1; int base1_2; virtualvoidbase1_ fun1({ }/virtualvoidbase1_ fun2) {}/…}; 在Base3中,他的大小为16,表示虚函数占用内存。

但是添加了很多虚函数,发现内存大小仍然是16。 在查阅资料时,我们发现类中的虚函数由一个称为虚指针的东西管理。 也就是说

指针(__vptr )记录用于存储此类中所有虚函数的存储器地址。

将容纳所有这种虚函数的这个存储器称为虚函数表。 访问虚函数表的各虚函数通过__vptr[0]、__vptr[1]、

对于Base3,在内存中可能是这样。

将virtual void base1_fun2添加到Base3时,在内存中情况如下。

case 4 :或更高版本的类共享一个虚函数表,每个类都有自己的虚指针。 # include ' stdio.h ' class base1{ public : int base1_ 1; int base1_2; virtualvoidbase1_ fun1{ } virtualvoidbase1_ fun2{ }; int main () { Base1 b1; Base1 b2; }

在上面的示例中声明,可以看到(1) b1和b2有自己的虚拟指针;2 )在一个程序中,一个类只有一个虚拟函数表。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。