【深入理解C++】空类对象所占用的空间大小

2023-11-06

1.须知

类本身是没有大小的。

类的大小指的是类的对象所占的大小。

如果用 sizeof 运算符对一个类型名操作,得到的是具有该类型实体的大小。

2.空类对象所占用的空间大小

#include <iostream>
using namespace std;

class A
{

};

int main()
{
	A obja;
	cout << sizeof(obja) << endl; // 1

	return 0;
}

C++标准指出,不允许一个对象的大小为 0 0 0,不同的对象不能具有相同的地址。这是由于:

  • new 需要分配不同的内存地址,不能分配内存大小为 0 0 0 的空间
  • 避免除以 sizeof(T) 时出现除以 0 0 0 的错误

因此,空类对象所占用的空间大小为 1 1 1,其原因是让对象的实例能够相互区别。从上面代码可以看出,空类同样能够被实例化,所以编译器会给空类隐含地添加 1 1 1 个字节,这样空类实例化之后就会拥有独一无二的内存地址。

当然,一旦空类中有其他的占用空间的成员,那么这 1 1 1 个字节就不计算在内了。

例如,一个类中只有一个 int,则其占用 4 4 4 字节而不是 5 5 5 字节。

#include <iostream>
using namespace std;

class A
{
	int x;
};

int main()
{
	A obja;
	cout << sizeof(obja) << endl; // 4

	return 0;
}

3.一个类继承空类

当一个类继承空类时,空基类的 1 1 1 个字节并不会加到子类中去。

#include <iostream>
using namespace std;

class A
{

};

class B : public A
{

};

int main()
{
	A obja;
	cout << sizeof(obja) << endl; // 1

	B objb;
	cout << sizeof(objb) << endl; // 1

	return 0;
}
#include <iostream>
using namespace std;

class A
{

};

class B : public A
{
	int x;
};

int main()
{
	A obja;
	cout << sizeof(obja) << endl; // 1

	B objb;
	cout << sizeof(objb) << endl; // 4

	return 0;
}

4.空类作为另一个类的成员

当空类作为另一个类的成员时,空类的 1 1 1 个字节会被计算在内。

然而,你会发现下面代码在大多数编译器中 B 类对象所占用的空间大小为 8 8 8。这是由于空类对象的大小虽然为 1 1 1,但是为了内存对齐,编译器会额外加上一些字节,使其被放大到足够可以存放一个 int

#include <iostream>
using namespace std;

class A
{

};

class B
{
	int x;
	A a;
};

int main()
{
	A obja;
	cout << sizeof(obja) << endl; // 1

	B objb;
	cout << sizeof(objb) << endl; // 8

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深入理解C++】空类对象所占用的空间大小 的相关文章

随机推荐

  • CMake设置MSVC工程MT/MTd/MD/MDd

    文章目录 0 前言 1 如何设置 1 1 CMakeLists代码 1 2 要点1 POLICY 1 3 要点2 set property 0 前言 在MSVC工程上右键 gt 属性 找到配置属性 gt C C gt 代码生成 gt 运行库
  • 设计模式精讲-抽象工厂方法模式

    设计模式 抽象工厂方法模式 定义 示例 应用场景 优点 定义 提供一个创建一系列相关或互相依赖对象的接口 而无需指定它们具体的类 定义和图不理解的 可以先看下面的示例 回头再去理解 示例 以数据库为例 1 变化的部分 Mysq Oracle
  • 在LDAP中使用角色(Role)和组(Group)来管理用户

    LDAP 轻量级目录服务器 越来越被广泛的使用 特别是在管理海量用户信息和管理身份认证信息的时候 LDAP被国内大多数企业所使用 从中国电信 中 国移动 新浪 和许多省市政府部门都使用LDAP来管理用户身份的信息 下面重点介绍在LDAP中管
  • 【JavaEE】多线程(四)

    多线程 四 在开始讲之前 我们先来回顾回顾前三篇所讲过的内容 线程的概念 并发编程 多进程 比较重 频繁创建销毁 开销大 Thread的使用 创建线程 继承Thread 实现Runnable 继承Thread 匿名内部类 实现Runnabl
  • 第2讲 Hi3861的WiFi实验-AP模式

    引言 在本文中 带大家编写一个程序 测试Hi3861的WiFi AP模式 进一步熟悉相关API的使用 请先按照本专栏第一讲中的第四部分准备好实验环境 一 编写程序 首先 打开 DevEco Device Tool 在鸿蒙项目 hispark
  • 查看php已安装扩展命令

    php m
  • 模型训练时间计算

    一 时间戳计算 记录当前时间 或者用 time perf counter 精度更高 import time t0 time time t0 time perf counter 记录结束时间 t1 time time t1 time perf
  • C# winform使用StreamWriter的方式将dataTable导出到Excel

    代码笔记 public void Export2Excel if this GridView logData Rows Count gt 0 SaveFileDialog saveFileDialog new SaveFileDialog
  • 【HAL库】STM32F103输出固定数量的PWM波形

    目的 用STM32F103ZET6的TIM1 CH1输出10个脉冲 实现方法主要有两种 一种用中断计数 一种用主从定时器门控方式 一 中断计数 首选需要选择合适的IO口 我选的是PE9 对应TIM1 CH1 然后在STM32CUBEMX里面
  • C++继承和多态特性

    文章目录 前言 1 什么是面向对象的继承特性 2 C 继承中的权限管控 3 继承体系下子类和父类的关系 4 派生类和基类的构造析构关系 5 派生类和基类的同名成员问题 6 子类和父类的类型兼容规则 7 继承的优势与不良继承 8 组合介绍以及
  • windows10家庭版远程桌面连接报错:CredSSP加密oracle修正

    原地址 https www cnblogs com lindajia p 9021082 html Windows10远程桌面连接 报错信息 网上找到方法 但是奈何是 Win10家庭版 不能使用这个办法 具体操作可以看最后的引用链接 策略路
  • 【应急响应】后门攻击检测指南&Rookit&内存马&权限维持&WIN&Linux

    文章目录 Windows实验 常规后门 网络对外连接查看 自启动测试 隐藏账户 映像劫持 屏保 登录 Linux实验 常规后门 Rootkit后门 GScan rkhunter 权限维持后门 GScan rkhunter Web层面 通用系
  • 秋叶大神的Stable Diffusion整合包

    前段时间在研究Stable Diffusion本地化部署 但是对于新手小白来说算是比较难得 不过没关系 我在B站发现了秋叶大神的Stable Diffusion整合包 我在用很方便 必须分享出来 Stable Diffusion整合包下载地
  • 基于vue的页面加载动画

    基本原理是 在window加载之前 渲染出加载动画 页面渲染完成后 移除加载动画即可 在vue项目中一般只需二步 第一步 写css和dom 在vue项目的index html中引入css 第二步 在app vue created中移除加载动
  • pytorch_lighting

    1 pytorch lighting 简介 1 1 pytorch lighting 是什么 1 1 1 pytorch lightning 是什么 PyTorch Lightning 是一个开源的 PyTorch 加速框架 它旨在帮助研究
  • vue+Element-ui实现树形组件、表格树

    需求 要做出如下图所示的 树形表格 也就是数据之间有父子类关系的这种 可以点击展开 收缩 像上图这样的表格树 实现 1 使用树形组件 在学习树形表格之前 肯定得先搞懂普通的树形组件是怎么搞的 然后将其套到表格中就好了 请参考ElementU
  • linux real时间,【整理】RT-linux 实时Linux RealTime Linux

    折腾 整理 数控系统 操作系统 期间 看提到了RT linux 去研究看看 RT linux Vanilla kernel的问题 Linux kernel在spinlock irq上下文方面无法抢占 因此高优先级任务被唤醒到得以执行的时间并
  • 力扣刷题:两数相加

    给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的 并且每个节点只能存储 一位 数字 请你将两个数相加 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外 这两个数都不会以 0 开头 输入 l1
  • Android Studio Proxy Setting 设置(详细图文说明)

    Android Studio代理设置 Android Studio Proxy Setting 设置 在很多时候编译依赖的相关库文件都是需要墙出去的 所以我们得学会怎么翻 具体可以查查网上很多详细的攻略 这里只介绍墙完后Android St
  • 【深入理解C++】空类对象所占用的空间大小

    文章目录 1 须知 2 空类对象所占用的空间大小 3 一个类继承空类 4 空类作为另一个类的成员 1 须知 类本身是没有大小的 类的大小指的是类的对象所占的大小 如果用 sizeof 运算符对一个类型名操作 得到的是具有该类型实体的大小 2