当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《关于sizeof和类成员函数的问题》经验,为你挑选了2个好方法。

这个:

class B
{
   public:
     int a;
     void fn();
};

出于所有实际目的,等同于C代码:

struct B
{
   int a;
};

void fn(B* bInstance);

除了在C++版本中,bInstance被替换为this指针.两个函数的内存都存在于堆栈中.所以转换为struct equivelant,你认为(B)的大小是多少?



1> Konrad Rudol..:

fn()的内存位于何处?

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

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

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

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



2> Doug T...:

这个:

class B
{
   public:
     int a;
     void fn();
};

出于所有实际目的,等同于C代码:

struct B
{
   int a;
};

void fn(B* bInstance);

除了在C++版本中,bInstance被替换为this指针.两个函数的内存都存在于堆栈中.所以转换为struct equivelant,你认为(B)的大小是多少?

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有