怎么计算一个类的大小 (C++)

怎么计算一个类的大小 (C++)

怎么计算一个类的大小 (C++)


文章目录


图文版

在这里插入图片描述

文字版

这是一个非常经典的C++面试题。在C++中,计算一个类的大小并不是简单地将成员变量的大小相加,而是涉及内存对齐虚函数继承等多个因素的影响。

以下是计算类大小的核心规则和详细步骤:

核心结论速览

  1. 非静态成员变量 是影响大小的主体。
  2. 静态成员变量 不属于类实例,存在全局数据区,不计入sizeof
  3. 成员函数 存在代码段,不计入sizeof
  4. 虚函数:只要类有虚函数(无论是1个还是多个),类实例中就会有一个虚函数表指针(vptr),在64位系统下通常占8字节,32位下占4字节
  5. 内存对齐:编译器为了提高访问效率,会在成员之间或末尾填充字节,使变量存储在其倍数地址上,并使类总大小是最大对齐数的整数倍。
  6. 继承
    • 空类大小为1字节(为了占位,表示对象存在)。
    • 派生类的大小一般是基类成员 + 派生类新成员,同时也要满足对齐规则。

详细计算步骤与示例

1. 基础计算:空类
classEmpty{// 没有任何成员};
  • 大小1字节
  • 原因:编译器需要给这个类的对象分配一个独一无二的地址,所以会隐式插入1个字节。
2. 只有成员变量(考虑内存对齐)

对齐规则:

  1. 第一个成员在偏移量为0的位置。
  2. 后续成员要放到该成员大小的整数倍上。
  3. 最终类的大小要是最大成员大小的整数倍。
classExample1{char c;// 1字节int i;// 4字节};
  • 分析
    • c 占偏移0。
    • i 占4字节,需要从4的倍数(偏移4)开始存。因此,在 c 后面会有3个字节的填充
    • 此时已占:1© + 3(填充) + 4(i) = 8字节。
    • 最大对齐数是4,8是4的倍数,无需末尾填充。
  • 结果8字节(而不是直觉上的 1+4=5)。
3. 有虚函数(引入虚表指针)
classBase{int a;virtualvoidfunc(){}};
  • 分析
    • int a:4字节。
    • 虚函数表指针(vptr):64位系统下8字节。
    • 内存对齐:最大对齐数是8(vptr)。a 从偏移0开始占4字节,为了放8字节的vptr,需要在 a 后面填充4字节,使vptr从偏移8开始。
    • 总大小 = 4(a) + 4(填充) + 8(vptr) = 16字节。
  • 结果16字节
4. 继承关系
classA{int a;// 4char b;// 1// 实际A的大小:对齐到4,b后面填充3字节,A为8字节};classB:publicA{int c;// 4char d;// 1};
  • 分析
    • 先放基类A的部分:8字节。
    • 再放派生类B的 c:偏移8(刚好是4倍数),占4字节,总偏移12。
    • 再放 d:偏移12,占1字节,总偏移13。
    • 对齐收尾:B中最大对齐数是4(int),当前总大小13不是4的倍数,所以末尾填充3字节到16。
  • 结果16字节
5. 特殊情况:虚继承

虚继承涉及虚基类指针或类似机制(编译器实现不同,但通常会增加额外开销),用来解决菱形继承问题。

classA{int x;};// 4字节,对齐后可能8?classB:virtualpublicA{int y;};
  • 结果:通常比普通继承多出一个指针的大小(8字节),用来定位虚基类子对象。情况比较复杂,取决于编译器实现。

总结清单

计算类的大小时,可以按以下清单排查:

  1. 基本大小:列出所有非静态成员变量的大小。
  2. 虚函数检查:如果有 virtual 函数(包括继承来的),加上虚表指针的大小(8/4字节)。
  3. 虚继承检查:如果有虚继承,加上虚基类指针的开销(通常也是8/4字节)。
  4. 内存对齐
    • 计算每个成员相对于起始地址的偏移,插入填充
    • 最后让总大小是最大对齐数的整数倍,末尾填充

简记:

类的大小 = 非静态成员变量大小之和 + 虚函数/虚继承指针开销 + 内存对齐填充字节。

总结

这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持
作者wkm是一名中国矿业大学(北京) 大一的新生,希望得到你的关注
如果可以的话,记得一键三联!

Read more

告别塑料感!阿里Qwen-Image-2512用真实质感重新定义AI绘画

告别塑料感!阿里Qwen-Image-2512用真实质感重新定义AI绘画

2025年12月31日,当多数人在准备跨年时,阿里通义千问团队突然开源了Qwen-Image-2512这款图像生成模型。它号称要干掉“AI味”,生成的照片比真人拍的还真实。我抱着“真的假的”的心态试用了几天,结论是:它对新手极其友好,且效果突出。 01 模型进化,让AI绘画告别“塑料感”时代 AI绘画一直有个难以摆脱的标签——“AI味”,那种过于完美却不真实的质感,让作品总显得有点“塑料感”。 Qwen-Image-2512针对这一痛点进行了升级更新,让生图效果更细腻、也更真实。 人物肌肤质感方面,新模型能够生成真实毛孔纹理与细微光影变化,发丝根根分明,眼神生动自然。 在自然纹理还原上,无论是风景构图中的水流、树木,还是动物毛发,都呈现出惊人的细腻度。 复杂文字渲染是Qwen-Image系列的强项,而2512版本进一步提升了文字渲染质量与排版准确性,图文混合渲染更加精准。 在AI Arena平台进行的超过1万局模型盲测中,Qwen-Image-2512被评为当前最强开源图像生成模型,甚至在某些方面可与闭源商业模型一较高下。 02 零门槛入门,两种方式快速上手 对于

By Ne0inhk
降本 100%!告别无限的 token 消耗 !OpenClaw (龙虾) 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗

降本 100%!告别无限的 token 消耗 !OpenClaw (龙虾) 本地推理方案:基于 Ollama 部署开源模型替代云端 Token 消耗

摘要 OpenClaw(社区昵称 “大龙虾”)作为 2026 年最火的 AI Agent 框架,凭借强大的自动化执行能力成为开发者标配。但随着使用频次提升,云端大模型 Token 消耗成本居高不下,成为个人开发者与中小企业的核心痛点。本文针对最新版 OpenClaw 2026.2.26,提供一套零成本、可复现的本地化解决方案:通过 Ollama 部署开源大模型,彻底摆脱云端依赖,解决命令行参数失效、认证配置错误等核心问题,实现 “本地推理 + 本地执行” 的全闭环,兼顾成本、隐私与性能。 关键词:OpenClaw;Ollama;本地部署;开源模型;Token 降本;AI Agent;2026.2.26 一、痛点直击:为什么你的

By Ne0inhk
Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 git_hooks 鸿蒙强干预研发质量审核截断防线设防适配解析:依托钩子拦截引擎封锁全域代码递交链路建立极强合规化审计审查防火墙斩断技术债堆砌 前言 在 OpenHarmony 的大规模团队协作中,代码质量是团队的生命线。如果没有有效的约束,不符合规范的代码(甚至是无法通过静态分析的代码)会轻易地通过 git commit 进入代码库,导致 CI 构建频繁失败。git_hooks 库为 Flutter 开发者提供了一种轻量级的脚本化方案,可以在 Git 的关键生命周期(如提交前、推送前)自动运行检查。本文将带大家在鸿蒙端实战适配该库,夯实自动化工程的地基。 一、原直线性 / 概念介绍 1.1 基础原理/概念介绍 git_hooks 的核心逻辑是基于 Git

By Ne0inhk
飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程

飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程

飞书机器人与Claude Code交互:从手机指令到AI处理的全自动流程 * 一、背景 * 二、实现方案概览 * 三、操作步骤 * 前置准备 * 第一步:创建并进入Claude Code容器 * 配置Claude Code使用本地模型 * 测试Claude Code是否正常工作 * 第二步:安装Python依赖 * 第三步:获取飞书应用的凭证 * 第四步:编写并运行中间件脚本 * 脚本解释 * 运行脚本 * 第五步:在飞书中与机器人对话 * 常见问题 * 总结 一、背景 在日常开发中,我们经常需要快速查询代码问题、生成文档或执行简单的编程任务。如果有一款AI助手能随时响应,就像在电脑终端前一样,那该多方便!本教程将演示如何搭建一个飞书机器人,当你在手机飞书App上发送消息时,该消息会传递给运行在电脑上的Claude Code(一个智能编码助手),Claude Code处理后将结果回复到你的飞书会话中。 通过这个方案,你可以: * 在手机上随时向AI提问编程问题。 * 让AI帮你调试

By Ne0inhk