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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

对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],如下图:
    在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值