Inside the C++ Object Model

经常遇到有关C++的奇怪问题,而且常常不是什么难题,但是就是觉得一团糟。偶然接触到C++对象模型的概念,挖掘出一本经典的书籍Inside the C++ Object Model,虽然年代久远,书中也有多处明显错误,但瑕不掩瑜,仔细品读,还是有茅塞顿开的感觉。参考shifan的总结,我将部分关键的图片罗列出来,以便以后查阅。

Data Layout

一般视图:
Plain

带字节对齐的视图:
Alignment

继承视图:
Inheritance

组合视图:
Object in object

带虚函数的一般视图:
Common implementation I

另一种带虚函数的一般试图:
Common implementation II

g++视图:
Linux g++ implementation

多虚继承:
Chaotic

Virtual/Static Binding

  • 虚绑定(Virtual Binding):指向某一对象的指针或引用调用虚函数就是虚绑定。
  • 静态绑定(Static Binding):指向某一对象的指针或引用,或是对象本身,调用任何非虚函数就是静态绑定。

Type info

MSVC视图:
MSVC implementation
Linux g++ 视图:
Linux g++ implementation

构造顺序

虚基类->基类->虚指针(vptr)->不再初始化列表中的对象->初始化列表中的对象->构造器。

  • 虚指针(vptr)沿着继承树不断被替换。
  • 不论是静态绑定还是动态绑定,虚函数都会在构造完成前失去虚特性(virtuousness)。

评论