【C++】013、空类占多少字节?

C++算法竞赛入门常用知识点 阅读详情

一、空类占1字节

  • 在绝大多数编译器下,一个空类的sizeof结果是1字节。

  • 用于保存内存中拥有的唯一地址

二、为什么是1字节

  • 在C++中,任何完整的对象在内存中都必须具有唯一的地址

class Empty {};

int main() {
    Empty e1, e2;
    std::cout << sizeof(Empty) << std::endl; // 输出:1
    std::cout << &e1 << " " << &e2 << std::endl; // 输出两个不同的地址(说明确实占了1字节,地址不同)
}

三、空基类优化(EBO)

  • 如果空类作为基类被继承,编译器通常不会为基类对象分配那1字节内存,而是直接复用派生类的空间

  • 可以理解为空基类是邮戳,派生类的地址是信封,基类地址在派生类空间内,直接复用。

class EmptyBase {};

class Derived : public EmptyBase {
    int x; // 4 字节(不考虑对齐)
};

int main() {
    std::cout << sizeof(EmptyBase) << std::endl; // 输出:1
    std::cout << sizeof(Derived) << std::endl;   // 输出:4(而不是 5!)
    // 编译器没有为 EmptyBase 分配那额外的 1 字节,直接复用了 Derived 的空间。
}

四、有虚函数的基类,大小不是1字节

  • 因为虚函数会创建虚表指针,大小不是1

class EmptyWithVFunc {
public:
    virtual void foo() {}
};
std::cout << sizeof(EmptyWithVFunc) << std::endl; // 64位输出 8

【笔记】- 蒟蒻学习C/C++的一点点笔记(注意的点) C/C++中的一点点笔记(注意的点) 数据类型 两个整数相除 得到的还是整数; 只要有一个浮点数,结果就是浮点数 如3 / 2 = 1; 3.0 / 2 = 1.5; 输入、输出的使用 scanf("%d",&a); //不要忘了&; scanf ("%d",&arr[b]);千万不要写成 scanf (" %d ",&arr[b]); 就是在%d... 阅读详情

相关推荐

【013】C++数组之一维数值数组和二维数值数组的概念和操作方法

数组名和[]表示数组。将数组的个数放入[]中。用元素类型定义一个变量。数组的大小定义时必须指定,并且不可更改。int arr[5];// 定义一个包含5个整型元素的数组// 定义一个包含10个单精度浮点型元素的数组// 不指定数组大小,直接用花括号赋值// 定义一个包含100个字符元素的数组,并初始化为字符串"Hello World"以上示例中,第一个和第二个示例分别定义了一个整型和单精度浮点型的一维数值数组。第三个示例使用了花括号对数组进行初始化,编译器会自动计算出该数组大小为4。

Lion_Long的博客 2024

memset字节级填充

memset字节级填充

CodeDingHai的博客 817

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1836

cpp_对象size情景积累

1.常见类型实例大小(32位环境下) 空类的实例:1字节,理由:任意实例在内存中都有唯一的地址,为此,编译器给空类的实例加一个字节空间。 enum:4字节。 2.字节对齐(略) 3.同类型不同平台的差异(略) 4.virtual 注意:本次是32位环境下 #include <iostream> using namespace ...

dishandui6433的博客 183

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学

本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。

weixin_29251337的博客 534

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南)

本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。

weixin_42526015的博客 106

C++基础

004.C++里有哪几种数据类型? 答: 大致分为三大类: 一是基本类型,基本类型又包括整型,字符型(char),浮点型,布尔型(bool)。 而整型包括短整型(short int),整型(int),长整型(long int); 浮点型包括单精度型(float),双精度型(double),长双精度型(long double)。 二是派生类型,派生类型又包括指针类型(*),枚举类型(enum),数组...

weixin_44747173的博客 141

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 974

C++ 引用的本质

引用是 C++ 引入的重要特性,它使原来在 C 中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢?

Doublelv 的博客专栏。 1万+

OpenVox 8FXO板卡驱动安装记录

OpenVox A800P和A1200P的板卡驱动安装及问题解决方法

clliu的专栏 2463

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2204

《你真的了解C++吗》No.013:虚析构函数的强制性——被遗忘的清理任务

优先使用组合:如果不是为了多态,不要使用继承。接口类:如果必须多重继承,尽量只继承一个有数据的基类,其余全为纯虚接口(不含数据成员的类,可以避免大部分偏移麻烦)。警惕强转:在多重继承下使用是极度危险的,因为它不会处理指针偏移,务必使用或。既然我们谈到了能够安全处理指针偏移,那么它是如何在运行时“侦测”出一个对象的真实类型的?➡️《你真的了解C++吗》No.014:RTTI 的代价 (The Cost of RTTI): typeid 与 dynamic_cast 的真相。

腾TO的技术博客 805

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2236

【C++】类和对象(上篇)

C++类和对象 this指针

Suk_god的博客 4706

【Bug已解决】Request timed out / API Timeout — Claude Code 请求超时解决方案

方案适用场景推荐指数难度方案一:增加超时大任务处理⭐⭐⭐⭐⭐低方案二:切换 SonnetOpus 太慢⭐⭐⭐⭐⭐低方案三:缩小范围大代码库⭐⭐⭐⭐⭐低方案四:优化网络网络延迟高⭐⭐⭐⭐中方案五:减少 MCPMCP 超时⭐⭐⭐中方案六:流式响应长生成任务⭐⭐⭐低根本原因:请求超时最常见原因是请求体过大(35%)和 Opus 模型推理慢(25%),默认 60 秒超时阈值对大型任务不够最佳实践。

一键难忘的博客 5161

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++ —— 理解引用及其原理

概念 引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。 底层实现 在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。 我们借助代码进行探索 int i=5; int &ri=i; ri=8; 通过:调试->窗口->反汇编 int i=5; 00A013DE mov dword

ifwecande的博客 1637

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++基本数据类型

C++day2 第一章 C++ 基本数据类型 文章目录C++day2前言一、整形二、实型-浮点型三、字符和字符串四、布尔类型五、附录-转义字符表总结 前言 C++基本数据类型详解 提示:以下是本篇文章正文内容,下面案例可供参考 一、整形 一个字节占8位 short(短整型 2字节) int(整型 4字节) long(长整型 4字节 在64位linux虚拟机里是8个字节) long long(长长整型 8字节) short a = 32768;

LiYanHu0的博客 2558

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

013-Detours

Detours通过动态修改目标函数指令实现API拦截

zhengtianzuo的博客 554

C++引用和指针的区别

作者:RainMan 链接:https://www.zhihu.com/question/37608201/answer/545635054 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 引用是C++引入的重要机制(C语言没有引用),它使原来在C中必须用指针来实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢? 1.引用的底层实现方式 引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理.

sunlin972913894的博客 7606

黑马程序员C++笔记

黑马程序员C++笔记

m0_62076827的博客 5424

C/C++实战013:BOOL和bool的区别及MSB6006报错

今天开始写北京精雕设备的二次开发,拿到开发包看了下精雕的提供的程序大部分都是BOOL类型的返回值(不是bool哦),所以这里我们需要来了解下BOOL和bool的相关问题。 什么是bool bool是 C++ 定义的标准数据类型 :布尔类型,bool定义只有一个字节,可以用C++ 定义的标准关键字true 和 false(小写的)来表示,即返回值为!=0为true,0为false。 什么是...

kevinfan的博客 671

从外到内理解c++引用

从外到内理解c++引用

weixin_52259848的博客 2万+

c_013 指针详解

指针详解

zhongxuewei的博客 283

json.cpp错误码详解:从illegal_character到depth_exceeded的完整指南

json.cpp是一个专为经典C++设计的轻量级JSON解析库,以其卓越的性能和严格的JSON标准兼容性而闻名。作为C++开发者处理JSON数据的重要工具,理解其错误码系统对于编写健壮的应用程序至关重要。本文将深入解析json.cpp从illegal_character到depth_exceeded的所有错误码,帮助您快速定位和解决JSON解析问题。 ## 🔍 为什么需要了解json.cpp错

gitblog_00564的博客 389

C++引用本质

代码运行环境:Windows7 32bits+VS2017+Win32。 引用是C++引入的重要机制,它使原来在C中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢? 1.引用的底层实现方式 引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理解,并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。 实际上,引用本身是一个变量,只不过这个变量的定义和使用与普通变量有显著的不同。

qq_46359697的博客 496
上一篇: 【C++】012、typedef和using的区别
下一篇: 【C++】014、左值与右值的区别
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值