摘要: 本文通过使用gdb和g++工具,结合示例代码,详细分析了C++类的内存布局。作者验证了虚表在类层面只存一份,所有实例共享;成员函数地址唯一,成员变量在实例内存中各自独立,存放在实例地址之后;派生类的成员变量和基类不同,虚表指针由编译器自动添加,指向虚表。总结出类成员函数共享、成员变量实例独立、虚表单一且由编译器管理的内存分布特征。 (评价: A)
gdb test
# 在main函数打断点
(gdb) b main
Breakpoint 1 at 0x555555554863: file test.cpp, line 23.
# 运行至断点处
(gdb) r
# 执行next若干次
(gdb) n
# 查看*a = new A() 的虚表
(gdb) i vtbl a
vtable for 'A' @ 0x555555754d80 (subobject @ 0x555555767e70):
[0]: 0x5555555548fe <A::funcV()>
# 查看*b = new B() 的虚表
(gdb) i vtbl b
vtable for 'B' @ 0x555555754d68 (subobject @ 0x555555767e90):
[0]: 0x55555555490a <B::funcV()>
(gdb) i vtbl a
vtable for 'A' @ 0x555555754d80 (subobject @ 0x555555767e70):
[0]: 0x55555555494a <A::funcV()>
(gdb) i vtbl b
vtable for 'B' @ 0x555555754d68 (subobject @ 0x555555767eb0):
[0]: 0x55555555494a <A::funcV()>