当前位置: 首页 > 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.rkmt.cn/news/7906.html

相关文章:

  • 做题
  • SchemaStore
  • Visual Studio 2026 Insiders 重磅发布:AI 深度集成、性能飞跃、全新设计
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-29- 操作单选和多选按钮 - 下篇(详细教程) - 北京
  • 自定义注解实现服务分处理-策略模式
  • 远程控制应用的中的全球节点功能如何开启?插件类型、并发数量怎么选?
  • openEuler 24.03 (LTS-SP2)安装mysql 8.0.41
  • 7.数据库归档异常检查与处理
  • AI 赋能 APP 界面设计公司:从美学到交互的智能升级
  • Microsoft AI Genius 限时挑战赛:实战开启,等你应战!
  • 3.sysaux tablesace 清理
  • 在AI技术快速实现功能的时代,挖掘新需求成为核心竞争力——某知名Android面试题库需求洞察
  • php本地搭建知识库实现rag遇到的各种问题解决方式
  • 【字节跳动】LLM大模型算法面试题:大模型 LLM的架构介绍? - 教程
  • 解码C语言指针
  • windows下Qt调用fftw库
  • jenkins的安装和配置
  • 深入解析:【Day 52 】Linux-Jenkins
  • 本土开发者如何选择代码管理工具?Gitee与GitHub深度对比解析
  • C++ std::string
  • MathType数学公式编辑器v7.9.1
  • 2025 ICPC网络赛第一场 L cover
  • 实用指南:22 C++11 初始化新姿势:{} 统一初始化(省等号)+initializer_list 底层解析
  • 第九届电气、机械与计算机工程国际学术会议(ICEMCE 2025)
  • 第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)
  • 文件自动同步软件用哪个好,高效选择指南
  • 【初赛】指针 - Slayer
  • 国产化FPGA-2050-基于JFMK50T4(XC7A50T)的核心板
  • hbase学习2
  • MySQL迁移至GreatSQL后,timestamp字段插入报错解析