目的
对c++对象的内存布局有点迷糊,学习之中简单记录一下,以便复习查阅。
环境:
g++:g++ (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0
一. 示例1
存在一个类,包含有三个虚函数,分别打印不同的字符串。在main.cpp函数中定义一个类的示例对象,通过分析示例对象的信息,达到学习的目的。
#include <iostream>
using namespace std;
// 定义一个基类
class CBase
{
public:
virtual void f1() const { cout << "f1" << endl; }
virtual void f2() const { cout << "f2" << endl; }
virtual void f3() const { cout << "f3" << endl; }
};
// 调用函数
int main()
{
cout << "定义一个基类b" << endl;
CBase pBase;
return 0;
}
编译脚本:
CC=g++
CXXFLAGS=-std=c++11 -g
OBJ=main.o
SRC=
edit:main.o
$(CC) $(CXXFLAGS) -o main $(OBJ)
main.o:$(SRC)
$(CC) $(CXXFLAGS) -c main.cpp
.PHONY:clean
clean:
rm -rf main $(OBJ)
编译启动调试,断点到main.cpp的CBase pBase;行,运行程序。在开始调试之前我们需要设置一下gdb的调试输出,方便我们查看:
set print object onset print vtbl onset print pretty on
再输入r开始运行,如下:
运行到断点处,使用p pBase(print)查看示例对象的信息:

pBase示例对象包含有虚表指针_vptr.CBase,地址为:0x7fffffffde10
输入info vtbl pBase查看示例对象pBase的虚函数表内容:

CBase的虚表中包含有三个虚函数的指针,分别对应的是[0],[1],[2],如下图:

若使用微软的编译工具则看的更加明显:

本文通过一个包含三个虚函数的C++类示例,详细解析了对象的内存布局及虚函数表的工作原理。在g++环境下,通过gdb调试工具,展示了如何观察对象的虚表指针和虚函数地址,帮助理解C++多态性的实现。
1309

被折叠的 条评论
为什么被折叠?



