14,但这只是s1各个成员经过内存对齐之后的结果,我们还需要对s1进行一次“整体”填充,考虑到s1中最大的成员大小为4(s1.m_1和s1.m_3),由于14并不能整除4,所以需要在结构体末尾再填充2个字节...看来我们又再次遗漏了什么东西…
这次的问题是出在我们之前总结的公式上,由于之前我们仅考虑了基本类型,所以公式中大量使用了sizeof(Mi)这种形式,
但实际上,我们真正需要的是alignof(Mi)这种表达(即某个成员变量的对齐值...而现在我们引入了结构体形式的成员变量,sizeof(Mi) = alignof(Mi)这个前提便不再成立了,套用之前的公式自然也无法获得正确答案…
不过我们依然可以通过alignof来修正之前总结的计算公式...,vptr会置于类型的内存布局首部(继承类会复用基类的虚函数表指针),然后放置基类的数据成员,最后放置继承类的数据成员,放置方法仍然遵循之前所讲的对齐和填充规则,所以我们仍然可以套用公式来计算cv2的大小...首先放置B1的虚函数指针(I会复用该虚函数表指针)
b. 接着放置B1的数据成员,并逐个执行内存对齐
c. 接着放置B2的虚函数指针(如果有的话)
d.