当前位置: 首页 > 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.sczhlp.com/news/115639/

相关文章:

  • PyTorch 优化器(Optimizer)
  • 实用指南:域名市场中,如何确认域名的价值
  • 网站生成app 免费工具wordpress page显示
  • 网站官方首页设计房地产交易网站模版
  • 一个好的网站建设需要多少钱edu网站一般谁做的
  • 企业网站建设方案seo顾问阿亮
  • 初步了解Neo4j
  • 多模态和语音 AI 年度收官大会,把握 2026 技术风向标!
  • 做题
  • 解码C语言函数
  • 医院行业的网站是很难做吗我想做个网站 详解怎么做
  • 广州手机网站开发报价wordpress 分类 输出
  • 织梦手机网站怎么做沧县做网站
  • 邢台市政建设集团网站企业网站设计与实现
  • 国内设计网站大全python网页版运行器
  • 金华网站建设方案开发数据可视化网站
  • 青海网站设计企业聊城网站推广的公司
  • 外贸网站运营推广wordpress怎么加动态背景图图片
  • euorg免费域名怎么注册seo网站优化服务合同
  • SchemaStore
  • XSS攻击防御
  • imes开发部署
  • 思维题做题记录-1
  • 如何在极短时间内通透一个大型开源项目
  • 广告机免费投放兰州网络优化
  • 在网站上显示地图阿里云认证网站建设
  • 甘肃广川工程建设有限公司网站主要网站域名
  • 电脑维护网站模板合肥光束网站建设
  • 如何加强精神文明网站建设内容一个后台可以做几个网站
  • 广东广州网点快速网站建设桂林智能网络营销好选择