一、C语言中对象(object)的概念
注意,这里的对象可不是面向对象概念的对象哦!!!
参考链接:
《C++ difference between variable and object》
《对象和变量的区别》
参考书籍:
《品悟C -- 抛弃C程序设计中的谬误与恶习》
《标准C语言指南》
Class A
size=8 align=8
base size=8 base align=8 +-------------------+
A (0x0x7f25a1c36960) 0 +---------------+ | 16(vbase_off) |
| _vptr.B |----+ +-------------------+
Vtable for B +---------------+ | | 0(offset_to_top) |
B::_ZTV1B: 3 entries | B::b | | +-------------------+
0 16 +---------------+ | | ptr_typeinfo::B |
8 (int (*)(...))0 | A::a | +--> +-------------------+
16 (int (*)(...))(& _ZTI1B) +---------------| | VTT for B |
24 +-------------------+
VTT for B
B::_ZTT1B: 1 entries
0 ((& B::_ZTV1B) + 24)
Class B
size=24 align=8
base size=16 base align=8
B (0x0x7f25a1acc1a0) 0
vptridx=0 vptr=((& B::_ZTV1B) + 24)
A (0x0x7f25a1c369c0) 16 virtual
vbaseoffset=-24
B-in-D
+-----------------------+
| 20 (vbase_offset) |
VTT for D +-----------------------+
+-------------------+ | 0 (top_offset) |
| vtable for D |-------------+ +-----------------------+
+-------------------+ | | ptr to typeinfo for B |
| vtable for B-in-D |-------------|----------> +-----------------------+
+-------------------+ | | B::w() |
| vtable for B-in-D |-------------|--------+ +-----------------------+
+-------------------+ | | | 0 (vbase_offset) |
| vtable for C-in-D |-------------|-----+ | +-----------------------+
+-------------------+ | | | | -20 (top_offset) |
| vtable for C-in-D |-------------|--+ | | +-----------------------+
+-------------------+ | | | | | ptr to typeinfo for B |
| vtable for D |----------+ | | | +-> +-----------------------+
+-------------------+ | | | | | A::v() |
| vtable for D |-------+ | | | | +-----------------------+
+-------------------+ | | | | |
| | | | | C-in-D
| | | | | +-----------------------+
| | | | | | 12 (vbase_offset) |
| | | | | +-----------------------+
| | | | | | 0 (top_offset) |
| | | | | +-----------------------+
| | | | | | ptr to typeinfo for C |
| | | | +----> +-----------------------+
| | | | | C::x() |
| | | | +-----------------------+
| | | | | 0 (vbase_offset) |
| | | | +-----------------------+
| | | | | -12 (top_offset) |
| | | | +-----------------------+
| | | | | ptr to typeinfo for C |
| | | +-------> +-----------------------+
| | | | A::v() |
| | | +-----------------------+
| | |
| | | D
| | | +-----------------------+
| | | | 20 (vbase_offset) |
| | | +-----------------------+
| | | | 0 (top_offset) |
| | | +-----------------------+
| | | | ptr to typeinfo for D |
| | +----------> +-----------------------+
| | | B::w() |
| | +-----------------------+
| | | D::y() |
| | +-----------------------+
| | | 12 (vbase_offset) |
| | +-----------------------+
| | | -8 (top_offset) |
| | +-----------------------+
| | | ptr to typeinfo for D |
+----------------> +-----------------------+
| | C::x() |
| +-----------------------+
| | 0 (vbase_offset) |
| +-----------------------+
| | -20 (top_offset) |
| +-----------------------+
| | ptr to typeinfo for D |
+-------------> +-----------------------+
| A::v() |
+-----------------------+
0x555555755c20 <vtable for D>: 0x0000000000000020
0x555555755c28 <vtable for D+8>: 0x0000000000000000
0x555555755c30 <vtable for D+16>: 0x0000555555755d58
0x555555755c38 <vtable for D+24>: 0x0000555555554a48
0x555555755c40 <vtable for D+32>: 0x0000555555554a60
0x555555755c48 <vtable for D+40>: 0x0000000000000010
0x555555755c50 <vtable for D+48>: 0xfffffffffffffff0
0x555555755c58 <vtable for D+56>: 0x0000555555755d58
0x555555755c60 <vtable for D+64>: 0x0000555555554a54
0x555555755c68 <vtable for D+72>: 0x0000000000000000
0x555555755c70 <vtable for D+80>: 0xffffffffffffffe0
0x555555755c78 <vtable for D+88>: 0x0000555555755d58
0x555555755c80 <vtable for D+96>: 0x0000555555554a3c
0x555555755c88 <VTT for D>: 0x0000555555755c38
0x555555755c90 <VTT for D+8>: 0x0000555555755cd8 -----------------------+
0x555555755c98 <VTT for D+16>: 0x0000555555755cf8 |
0x555555755ca0 <VTT for D+24>: 0x0000555555755d18 |
0x555555755ca8 <VTT for D+32>: 0x0000555555755d38 |
0x555555755cb0 <VTT for D+40>: 0x0000555555755c80 |
0x555555755cb8 <VTT for D+48>: 0x0000555555755c60 |
0x555555755cc0 <construction vtable for B-in-D>: 0x0000000000000020 |
0x555555755cc8 <construction vtable for B-in-D+8>: 0x0000000000000000 |
0x555555755cd0 <construction vtable for B-in-D+16>: 0x0000555555755db8 |
0x555555755cd8 <construction vtable for B-in-D+24>: 0x0000555555554a48 <------+
0x555555755ce0 <construction vtable for B-in-D+32>: 0x0000000000000000
0x555555755ce8 <construction vtable for B-in-D+40>: 0xffffffffffffffe0
0x555555755cf0 <construction vtable for B-in-D+48>: 0x0000555555755db8
0x555555755cf8 <construction vtable for B-in-D+56>: 0x0000555555554a3c
0x555555755d00 <construction vtable for C-in-D>: 0x0000000000000010
0x555555755d08 <construction vtable for C-in-D+8>: 0x0000000000000000
0x555555755d10 <construction vtable for C-in-D+16>: 0x0000555555755d90
0x555555755d18 <construction vtable for C-in-D+24>: 0x0000555555554a54
0x555555755d20 <construction vtable for C-in-D+32>: 0x0000000000000000
0x555555755d28 <construction vtable for C-in-D+40>: 0xfffffffffffffff0
0x555555755d30 <construction vtable for C-in-D+48>: 0x0000555555755d90
0x555555755d38 <construction vtable for C-in-D+56>: 0x0000555555554a3c
0x555555755d40 <vtable for A>: 0x0000000000000000
0x555555755d48 <vtable for A+8>: 0x0000555555755de0
0x555555755d50 <vtable for A+16>: 0x0000555555554a3c
0x555555755d58 <typeinfo for D>: 0x00007ffff7dc74f8
0x555555755d60 <typeinfo for D+8>: 0x0000555555554c14
0x555555755d68 <typeinfo for D+16>: 0x0000000200000002
0x555555755d70 <typeinfo for D+24>: 0x0000555555755db8
0x555555755d78 <typeinfo for D+32>: 0x0000000000000002
0x555555755d80 <typeinfo for D+40>: 0x0000555555755d90
0x555555755d88 <typeinfo for D+48>: 0x0000000000001002
0x555555755d90 <typeinfo for C>: 0x00007ffff7dc74f8
0x555555755d98 <typeinfo for C+8>: 0x0000555555554c17
0x555555755da0 <typeinfo for C+16>: 0x0000000100000000
0x555555755da8 <typeinfo for C+24>: 0x0000555555755de0
0x555555755db0 <typeinfo for C+32>: 0xffffffffffffe803
0x555555755db8 <typeinfo for B>: 0x00007ffff7dc74f8
0x555555755dc0 <typeinfo for B+8>: 0x0000555555554c1a
0x555555755dc8 <typeinfo for B+16>: 0x0000000100000000
0x555555755dd0 <typeinfo for B+24>: 0x0000555555755de0
0x555555755dd8 <typeinfo for B+32>: 0xffffffffffffe803
0x555555755de0 <typeinfo for A>: 0x00007ffff7dc67f8
0x555555755de8 <typeinfo for A+8>: 0x0000555555554c1d