c++对象内存布局学习笔记(一)

目的

对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.cppCBase pBase;行,运行程序。在开始调试之前我们需要设置一下gdb的调试输出,方便我们查看:

  1. set print object on
  2. set print vtbl on
  3. set print pretty on
    再输入r开始运行,如下:
    在这里插入图片描述运行到断点处,使用p pBaseprint)查看示例对象的信息:
    在这里插入图片描述
    pBase示例对象包含有虚表指针_vptr.CBase,地址为:0x7fffffffde10
    输入info vtbl pBase查看示例对象pBase的虚函数表内容:
    在这里插入图片描述
    CBase的虚表中包含有三个虚函数的指针,分别对应的是[0],[1],[2]

若使用微软的编译工具则看的更加明显:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章