转自:http://blog.sina.com.cn/s/blog_b32586610101btqv.html
c++内存布局规则如下:
1.
2.
//////////////////////////////////////////////////////////
所有实例运行于32位机器上测试
/////////////////////////////////////////////////////////
·
class
{
public:
};
ASSERT(sizeof(A)
那么在每一个A对象内,只含有一个a,也就是,sizeof(A)
而b,foo(),bar(),都不在class
·
3.
·
class
{
public:
};
ASSERT(sizeof(B)
一个int和一个vptr,共8位
4.
·
5.
·
class
{
};
ASSERT(sizeof(C)
规则5有两条子规则,第一条对这个例子没用,经过第一条后C的大小还是5,可是第二条要求整个类要对齐,那么必须在char
如果int和char的声明顺序反一下,那么为满足第一条规则,类已经需要对齐成8了,已经是8那么第二条也满足了.
·
6.
·
class
{};
ASSERT(sizeof(D)
这1byte是编译器插进去的,如果不插的话,连续声明D
不过要注意的是,任何类继承了D,只要里面有vptr或者任何一个变量,那么编译器就不会在子类中加入这1
·
7.
·
·
{
};
class
{
};
ASSERT(sizeof(E)
编译器不会为了节省空间把E的成员插入到C为了内存对齐的而补出的空间中的.这道题我面试的时候被问过,我答16的时候面试官还认为错了,太浪费空间了.但是这的确是唯一的正确解.
·
8.
·
·
{
public:
};
class
{
};
class
{
};
ASSERT(sizeof(G)
3个int,2个vptr,一共20
·
9.
规则9
class
{
int
};
class
{
int
};
class
{
int
};
ASSERT(sizeof(J)
4个int一共是16,BHI3个类都有各自的vptr,16+4*3==28.
1.没有虚函数的单继承
2、成员函数定义在类体之外
3、调整字节对齐使bus的“运输量”达到最高效率
2.
在没有虚函数的情况下,多重继承与单继承没有多大区别,
3.有虚函数的单继承
1、虚函数表在类的最开始位置
2、子类覆盖父类的虚函数在虚函数表得到体现
3、子类新增的虚函数添加到虚函数表的末尾
4.有虚函数的多继承
1、在子类中的每一个父类都有一个虚函数表
2、子类新增的虚函数,按继承顺序放在第一个父类的虚函数表中
3、子类覆盖父类的虚函数在每一个父类的虚函数表得到体现
4.有虚函数的重复多继承
1、孩子类存在父类的两份拷贝。
2、孩子类的第二个父类的虚函数表,有些虚函数条目直接跳转到第一个父类的虚函数表的同名函数的,这只是VC的实现方式而已,其他编译器可能不是这样。
5.有虚函数的虚拟继承
1、虚基类放在孩子类的末尾
2、VC实现虚基类的方式是每一个子类用一个指向虚基类表的指针vbptr,同时,子类的虚函数表不在包含父类的虚函数地址。