这篇博客绕过前面模板和泛型编程,首先是因为这些知识多在这里一一列出也没有什么必要,毕竟一查都能查的到。其次是我自己本身也没使用过太多的泛型或者模板,也没什么心得。
所以写一个在做作业时候遇到的一点问题在这里记录一下。
可能原来对字节对齐规则理解有误,或者把内存对齐和字节对齐混淆了,如果有不对,还请批评指正。
首先叙述下题目
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跟普通指针不一样?还是虚函数虚表实现的细节方面的东西?
还有待查找和研究~
以上。