0

0

c++类的内存布局 c++对象模型初探【核心】

穿越時空

穿越時空

发布时间:2026-01-03 19:05:31

|

317人浏览过

|

来源于php中文网

原创

C++类内存布局由编译器严格决定:单一继承时基类在前、成员按序排列;含虚函数则对象首部有vptr指向vtable;多重继承中非最左基类需this偏移;虚继承引入vbptr和动态偏移,增加开销。

c++类的内存布局 c++对象模型初探【核心】

在 C++ 中,类的内存布局不是黑箱,而是由编译器依据标准和实现细节严格决定的。理解它,是掌握多态、继承、虚函数调用、指针偏移等底层行为的关键——它直接决定了 this 指针的值、static_castreinterpret_cast 的安全性,以及为什么某些对象不能简单 memcpy。

单一继承下的内存布局:数据成员顺序即内存顺序

非虚继承时,子类对象内存中依次排布:基类部分(按继承顺序)、自身成员变量(按声明顺序)。没有额外开销,也没有“间隙”(除非对齐要求插入填充字节)。

  • 基类子对象总位于对象起始地址(即 &obj == &obj.base)
  • 成员变量布局与声明顺序完全一致,编译器不会重排(除非开启特定优化且不改变可观察行为)
  • 空基类优化(EBO)可能使空基类不占空间,但其地址仍合法(通常复用子类首个成员地址)

虚函数表(vtable)与虚函数指针(vptr)的位置

含虚函数的类,编译器会在对象最前面插入一个隐式的 vptr(通常为指针大小,如 8 字节),指向全局只读的虚函数表(vtable)。vtable 本身不存于对象内,而是编译期生成的静态数据结构。

  • vptr 是每个对象的私有成员,不是类共享的;多态对象切片时会丢失派生类 vptr
  • vtable 条目顺序 = 虚函数首次声明顺序(包括从基类继承来的虚函数,若被重写则填入派生类版本)
  • 多重继承中,非最左基类子对象的起始地址 ≠ 整个对象起始地址,其 vptr 位于各自子对象头部

多重继承与指针调整:this 指针不再是简单的地址

当一个类从多个非虚基类继承时,各基类子对象在内存中并列排布。访问不同基类接口时,this 指针需做偏移调整——这由编译器在调用虚函数或进行 static_cast 时自动插入加减指令完成。

神卷标书
神卷标书

神卷标书,专注于AI智能标书制作、管理与咨询服务,提供高效、专业的招投标解决方案。支持一站式标书生成、模板下载,助力企业轻松投标,提升中标率。

下载

立即学习C++免费学习笔记(深入)”;

  • 最左基类子对象与派生类对象地址相同;其余基类子对象地址 = 对象首地址 + 偏移量
  • 虚函数调用通过 vtable 查找函数地址后,若该函数属于非最左基类,则编译器额外生成 this 调整代码(常见于 vtable 条目中存储“thunk”跳转桩)
  • static_cast(&d) 不是类型擦除,而是计算并返回 Base2 子对象的正确地址

虚继承:解决菱形继承歧义,引入虚基类指针(vbptr)

虚继承使共享基类只出现一次。为此,派生类中会添加 vbptr(指向虚基类表),并在运行时动态计算虚基类子对象的偏移。这带来额外空间与时间开销。

  • 虚基类子对象不一定在对象开头,也不一定紧邻某基类;其位置由最终派生类决定
  • vbptr 通常放在对象开始处(在 vptr 之后)或末尾,具体取决于编译器(如 MSVC 放开头,Itanium ABI 常放末尾)
  • 访问虚基类成员需两次间接寻址:先查 vbtable 得偏移,再加到 this 上定位成员——比普通继承慢

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

531

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1000

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

56

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

272

2025.12.29

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

python设置中文版教程合集
python设置中文版教程合集

本专题整合了python改成中文版相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.05

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

10

2026.01.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.3万人学习

Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号