加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 关于sizeof和类成员函数的问题

发布时间:2020-12-16 10:55:17 所属栏目:百科 来源:网络整理
导读:class B{ public: int a; void fn();} 如果我创建一个B的对象,使用 B* pb = new B; fn()的内存位于何处? 对象中是否有指针指向fn()的内存loaction? 如果是,为什么sizeof(B)返回值,就好像对象中根本没有指针一样? 解决方法 Where is the memory of fn() lo
class B
{
   public:
     int a;
     void fn();
}

如果我创建一个B的对象,使用

B* pb = new B;

fn()的内存位于何处?

对象中是否有指针指向fn()的内存loaction?

如果是,为什么sizeof(B)返回值,就好像对象中根本没有指针一样?

解决方法

Where is the memory of fn() locate?

因为它是一个正常的函数,在程序的代码部分的某个地方.该位置对于该类的所有实例都是相同的.事实上,它与通过pb实例化B无关.

Is there a pointer in object that pointing at the memory loaction of fn()?

对于普通的成员函数,这不是必需的,因为地址在编译时是已知的(或者,最迟在链接时);因此,它不必在运行时单独存储.

对于虚拟功能,情况有所不同.虚函数指针存储在一个数组中(简称为“虚函数指针表”或“vtable”).每个类都有一个这样的vtable,每个类的实例都存储一个指向该vtable的指针.这是必要的,因为如果Base类型的指针/引用指向子类Derived,则编译器无法知道要调用哪个函数;相反,正确的函数是在运行时通过在相关的vtable中查找来计算的. vtable指针在对象的大小中也很明显.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读