《GeekBand》c++面向对象高级编程03

这篇博客绕过前面模板和泛型编程,首先是因为这些知识多在这里一一列出也没有什么必要,毕竟一查都能查的到。其次是我自己本身也没使用过太多的泛型或者模板,也没什么心得。

所以写一个在做作业时候遇到的一点问题在这里记录一下。

可能原来对字节对齐规则理解有误,或者把内存对齐和字节对齐混淆了,如果有不对,还请批评指正。

首先叙述下题目

class Fruit{test
   int no;
   double weight;
   char key;
public:
   void print() {   }
   virtual void process(){   }
};
   
class Apple: public Fruit{
   int size;
   char type;
public:
   void save() {   }
   virtual void process(){   }
};

题目要求是说出这俩个类的大小,并且画出模型图。

很简单啊,先编个程序,一运行,有了下面这个运行图:

比划比划,8字节对齐啊这是,妥妥的画出下图:



图画出来,做个注释呗。是按8字节对齐……中间做了分割,其实是为了看出编译器补齐,不是真的分割……好像哪里不对,为啥第二行那个int和虚表指针没有并到一起?

画错了?不是8字节对齐?4字节对齐也对不上啊。。

然后有了下面若干个测试:

首先看一下有1个虚函数是多大:


4字节没问题啊。。

看看int+虚函数:


8字节,没有问题。

看看 int+char 和char +int


8字节木有问题;

看看 虚函数+int+char


12!!!!怎么是12,是4字节对齐了啊?

看看 int+double+char


啊?8字节了又?

然后,我就去查了查百度,发现字节对齐规则是以类内最大那个类型对齐的。。。我一直以为是跟机器相关的,32位就是4字节,64就是8字节。。。这好像是内存对齐?


然后,那为啥fruit类是32,不应该是24?

难道是因为虚函数?

看看void*+int+double+char


24字节!

....原来vptr跟普通指针不一样?还是虚函数虚表实现的细节方面的东西?

还有待查找和研究~


以上。



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值