结构体中虚函数的内存对齐问题

struct MyStruct 
{ 
    virtual void fun(){}
	char dda; 
	double dda1; 
}; 

求助大神,为什么上述结构体求sizeof是24呢(visual studio win32)?不是应该4+1+3+8=16吗?

可以参考这篇:https://blog.csdn.net/u012169230/article/details/51219863

还需要计算偏移量的,你理解的大小只是计算了实际类型占用大小。

内存对齐主要遵循下面三个原则:

  1. 结构体变量的起始地址能够被其最宽的成员大小整除
  2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
  3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

虚函数表,当一个类中含有虚函数的时候,数据成员中在开始的地方会存放一个指针,这个指针指向一张表,这个表中,依次存放类中各个虚函数的地址。继承类继承了基类后,也继承了这一张表(这个指向虚函数表的指针应该是静态数据类型)。当继承类改写了基类中的虚函数后,继承类中的虚函数表中对象的函数地址,就改成继承类改写的函数的入口地址,如果是新加的,依次放到函数表后面。多继承,会继承多个父类的指向虚函数表的指针。当用基类指针或者引用调用虚函数的时候,会根据实际指向的类型找到虚函数表,再根据表中的函数指针,从而调用正确的对象
 

也就是说,用了虚函数,其实结构中就多了一个隐藏的指针对象了

ps.已经了解了基本的字节对齐原理,只是按照这些资料,认为sizeof求大小就是4+1+3+8=16而不是8+1+7+8=24。如下结构体是4+1+3+8=16,也很好理解。猜测是因为虚函数表指针对齐方式与其他数据不同?

struct MyStruct2 
{ 
	char* pData; 
	char dda; 
	double dda1; 
}; 

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

自顶,求助!

自顶,求助!