c – 关于sizeof和类成员函数的问题
class B { public: int a; void fn(); } 如果我创建一个B的对象,使用 B* pb = new B; fn()的内存位于何处? 对象中是否有指针指向fn()的内存loaction? 如果是,为什么sizeof(B)返回值,就好像对象中根本没有指针一样? 解决方法
因为它是一个正常的函数,在程序的代码部分的某个地方.该位置对于该类的所有实例都是相同的.事实上,它与通过pb实例化B无关.
对于普通的成员函数,这不是必需的,因为地址在编译时是已知的(或者,最迟在链接时);因此,它不必在运行时单独存储. 对于虚拟功能,情况有所不同.虚函数指针存储在一个数组中(简称为“虚函数指针表”或“vtable”).每个类都有一个这样的vtable,每个类的实例都存储一个指向该vtable的指针.这是必要的,因为如果Base类型的指针/引用指向子类Derived,则编译器无法知道要调用哪个函数;相反,正确的函数是在运行时通过在相关的vtable中查找来计算的. vtable指针在对象的大小中也很明显. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |