当前位置: 首页 > news >正文

C++中类的内存存储

目录
    • 类对象的非虚成员函数
    • 类的成员变量
  • 空类对象
  • 具有虚函数的类对象

类本身不会存储在内存中,类实例化的对象才会保存在内存中。但是使用 sizeof 计算类大小时能得到结果,这是因为 sizeof 会在编译时就得到类型信息,这只与类的布局有关。

类对象的非虚成员函数

考虑如下代码:

#include <iostream>
using namespace std;class base {
public:int a;void show() {cout << "show" << endl;}void show1(){cout << "show1" << a << endl;}
};int main() {base* B = nullptr;B->show(); // 能正常工作B->show1();//段错误return 0;
}

成员函数统一保存在内存的代码区。所有类的对象共享同一份函数代码。调用函数时,编译器会自动将对象地址(也就是 this 指针)作为隐含参数传递给函数,从而访问对象的成员变量和其他成员函数。而函数地址在编译期就确定了。
这样也解释了静态成员函数和非静态成员函数的最大区别:静态成员函数不与任何对象实例绑定,所以它内部没有 this 指针。这意味着它不能直接访问类的非静态成员。但是可以通过类名直接调用,而非静态成员函数则需要通过对象调用。

类的成员变量

  • 静态成员变量:不属于任何对象实例,生命周期与程序相同,在程序启动时初始化,在程序结束时销毁。保存在静态/全局数据区
  • 非静态成员变量:是对象实例的一部分,存储位置取决于对象的存储位置。

空类对象

空类的大小为1B,这是因为每个对象都需要一个唯一地址,因此编译器会生成一个占位符来代表对象,为1B大小。

具有虚函数的类对象

先来看一下虚函数相关的知识:
对于有虚函数的类,编译器会为每个类对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针,也即虚表指针(vptr),这就是为什么一个包含虚函数的类,即使没有任何数据成员,其 sizeof 也至少是一个指针的大小(在32位系统上为4字节,64位系统上为8字节),函数数组即为虚函数表(vtbl)。虚函数表是和类绑定的,而虚表指针是和类对象绑定的。

  • 虚函数:任何函数代码都保存在代码段,虚函数也是;
  • 虚函数表:编译器在编译阶段就会为每一个包含虚函数的类(或者从包含虚函数的类派生而来的类)生成一个唯一的虚函数表。这个表在编译后就已确定,存储在静态/全局数据区中;
  • 虚表指针:绑定对象,存储在对象本身所在的内存区域。
http://www.hskmm.com/?act=detail&tid=9513

相关文章:

  • PyTorch 优化器(Optimizer)
  • 实用指南:域名市场中,如何确认域名的价值
  • 初步了解Neo4j
  • 多模态和语音 AI 年度收官大会,把握 2026 技术风向标!
  • 做题
  • 解码C语言函数
  • SchemaStore
  • XSS攻击防御
  • imes开发部署
  • 思维题做题记录-1
  • 如何在极短时间内通透一个大型开源项目
  • 求 Ray Ping - Gon
  • LCT学习笔记
  • Visual Studio 2026 Insiders 重磅发布:AI 深度集成、性能飞跃、全新设计
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-29- 操作单选和多选按钮 - 下篇(详细教程) - 北京
  • 自定义注解实现服务分处理-策略模式
  • iOS26正式版全新风格!一文汇总实用新功能!
  • 远程控制应用的中的全球节点功能如何开启?插件类型、并发数量怎么选?
  • 借助Aspose.HTML控件,使用 Python 将 HTML 转换为 DOCX
  • openEuler 24.03 (LTS-SP2)安装mysql 8.0.41
  • 7.数据库归档异常检查与处理
  • Gitlab 关键字
  • 8.listener日志占用过大处理方法
  • 马建仓AI助手完成全链路升级:三十余项新能力重塑研发工作流
  • 线性回归与 Softmax 回归:深度学习基础模型解析 - 实践
  • 浏览器下载,一定要开启这个隐藏功能!
  • 开源项目进度管理系统 PJMan:让技术项目进度可视化、数据化的利器
  • 【光照】[漫反射]UnityURP兰伯特能量守恒吗?
  • Microsoft AI Genius 限时挑战赛:实战开启,等你应战!
  • DevSecOps革命:测试工具如何重塑企业数字化转型的质量防线