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

2023-11-06

1.须知

类本身是没有大小的。

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

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

2.非静态成员变量(普通成员变量)

非静态成员变量(即普通成员变量),是在类的实例化过程中才在 栈区 或者 堆区 为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

非静态成员变量(即普通成员变量),跟着类对象走,是包含在每个对象中的,占用对象的内存空间,即每个类对象都有自己的成员变量。

#include <iostream>
using namespace std;

class A
{
public:
	int x;
};

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

	return 0;
}

如果类中有多个成员变量,则按照定义的顺序来保存,最先声明的在最上边,然后依次保存。

在下面的代码中,person 对象的内存在栈空间,则其包含的三个成员变量的内存也在栈空间。

#include <iostream>
using namespace std;

struct Person
{
	int m_id;
	int m_age;
	int m_height;

	void display()
	{
		cout << m_id << " " << m_age << " " << m_height << endl;
	}
};

int main()
{
	Person person;
	person.m_height = 3;
	person.m_age = 2;
	person.m_id = 1;

	cout << "&person = " << &person << endl;
	cout << "&person.m_id = " << &person.m_id << endl;
	cout << "&person.m_age = " << &person.m_age << endl;
	cout << "&person.m_height = " << &person.m_height << endl;

	return 0;
}

输出结果如下:

在这里插入图片描述

对象的内存布局如下:

在这里插入图片描述

3.静态成员变量

静态成员变量在类定义时就已经在 全局/静态存储区 分配了内存,因而它是属于类的。

静态成员变量不保存在对象内部,不占用类对象的内存空间。

#include <iostream>
using namespace std;

class A
{
public:
	static int x;
	static int y;
};

int A::x = 0;
int A::y = 0;

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

	return 0;
}

4.非静态成员函数(普通成员函数)

非静态成员函数(即普通成员函数)在类定义时放在 程序代码区,不占用类对象的内存空间。

#include <iostream>
using namespace std;

class A
{
public:
	void fun1() {};
	void fun2() {};
	void fun3() {};
};

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

	obja.fun1();

	obja.fun2();

	obja.fun3();

	return 0;
}

汇编代码如下:

在这里插入图片描述

5.静态成员函数

静态成员函数在类定义时放在 程序代码区,它是属于类的,不占用类对象的内存空间。

#include <iostream>
using namespace std;

class A
{
public:
	void fun1() {};
	void fun2() {};
	void fun3() {};
	static void sfun() {};
};

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

	return 0;
}

6.构造函数和析构函数

构造函数和析构函数不占用类对象的内存空间。

#include <iostream>
using namespace std;

class A
{
public:
	A() {};
	~A() {};
};

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

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

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

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 解决Python报错:PermissionError: [Errno 13] Permission denied

    这个错误是因为文件不存在或者文件已经被打开了 导致python没有权限去读写它 建议 先去检查文件是否存在 检查这个文件有没有打开 如果被打开的话 那么python是没有权限对它进行读写的 注意的是 有一些c盘的文件需要管理员授权 当然这个
  • LabVIEW串口通信实际操作

    理论基础 LabVIEW串口通信基础知识 读取串口字节 我们新建一个空白 VI 借助串口调试助手和虚拟串口 在 LabVIEW 中编写的一个最简单的例子 写一个基本的读取串口字节的程序 在程序框图中编程如下 注意这里 串口配置放到循环外 不
  • SpringBoot在静态方法或工具类中注入Bean及配置参数

    场景一 静态方法或工具类中注入Bean 示例 author version 1 0 description 通用工具类型 date 2022 5 22 19 36 public class CommonUtil Autowired priv
  • 论文阅读:CVPR2022 Wavelet Knowledge Distillation: Towards Efficient Image-to-Image Translation

    任务 图像转换 背景分析 生成对抗网络 GAN 在图像到图像的翻译中取得了显著成就 然而 由于参数量巨大 最先进的 GAN 通常存在效率低和内存使用量大的问题 为了应对这一挑战 本文首先从频率的角度研究了 GAN 的性能 结果表明 尤其是小
  • 【图论】最短路算法:Dijkstra、bellman-ford、spfa、Floyd 和拓扑排序

    是AcWing算法基础课关于基本图论算法的笔记 图片和引用来自给出原链接的 参考 AcWing 永远滴神 图来自这里 Dijkstra的使用条件是 边权非负即可 朴素版Dijkstra AcWing 849 Dijkstra求最短路 I 稠
  • MySQL半同步复制

    MySQL半同步复制 MySQL为了容灾数据一致性服务 有几种复制方式 主从复制方式 异步 半同步 lossless半同步复制方式 异步的复制 默认的复制是异步的 即master commit时不等更新被slave接受就向客户端回话应答成功
  • 二蛋赠书一期:《快捷学习Spring》

    文章目录 前言 活动规则 参与方式 本期赠书 快捷学习Spring 关于本书 作者介绍 内容简介 读者对象 获奖名单 结语 前言 大家好 我是二蛋 一个热爱技术 乐于分享的工程师 在过去的几年里 我一直通过各种渠道与大家分享技术知识和经验
  • 125KHz RFID芯片模块及电路替代方案

    125K RFID芯片模块是否可以写数据 以上是125KHz RFID芯片模块的供应商和芯片名称 频段 容量 功能 协议 18000 2 11784 11785协议 集成 RFID 收发器可对 100 到 150 kHz 频率范围内的转发器
  • 你所不知道的面试陷阱,巧妙避开,面试不再步步惊心

    你觉得自己比面试官更机智吗 如果准备充分 其实是可以的 在面试中 面试官有些时候会出一些陷阱题来考验你 这并不是出于恶意 而是希望对应聘者的能力有更加敏锐的判断 以下是10条最有可能难住你的面试陷阱问题以及化解它们的方法建议和回答样例 壹
  • 阿里员工离职换来一条血泪教训:以为当小白兔很安全,是你对职场最大的误解

    大家好 我是彭于晏 最近跟一些朋友见面 提起阿里辞退员工中 很多是职场小 老 白兔 看似温和 其实是组织中的祸患 这让我想起马云在湖畔大学首堂课上曾分享 小公司的成败在于你聘请什么样的人 大公司的成败在于你开除什么样的人 大公司里有很多老
  • 【C++】5、构建:CMake

    文章目录 一 概述 二 实战 2 1 内部构建 外部构建 2 2 CLion Cmake 一 概述 CMake 是跨平台构建工具 其通过 CMakeLists txt 描述 并生成 native 编译配置文件 在 Linux Unix 平台
  • vc2010使用libcurl静态库遇到连接失败的解决方案

    vc2010使用libcurl静态库 遇到连接失败的解决方案 2010 11 10 15 35 下载libcurl的源码 打开lib文件夹下项目 编译为静态链接库 在编译的时候出现问题如下 注 以前在vc2005下用mfc工程并且libcu
  • char型int型float型double型数组在内存中所占的字节数(16位、32位、64位PC机)

    在C语言中 以16位PC机为例 一个char型数据在内存中所占的字节数为1 一个int型数据在内存中所占的字节数为2 一个float型数据在内存中所占的字节数为4 一个double型数据在内存中所占的字节数为8
  • ThreadPool 线程池

    ThreadPool 线程池 1 例子 MyThreadPoolDemo 2 为什么用线程池 3 线程池如何使用 4 线程池几个重要参数 5 线程池底层工作原理 6 线程池用哪个 生产中如设置合理参数 一 MyThreadPoolDemo
  • Oracle数据库远程连接配置教程

    本人前一段时间做过Oracle数据库的相关工作 但是发现数据库的监听程序和服务名比较难搞定 而且网上也没有现成的教程 所以经过自己的探索之后将这片文章贡献给大家 如有不当之处还请谅解并请联系本人 此配置是在本机允许访问的前提下进行 如不允许
  • typescripe第二天—返回类型和注解

    函数参数类型和返回类型定义 简单类型定义 如下图 getTotal没有给它定义返回值类型 虽然被推断出了返回值是number类型 但如图所示 有string存在时 并未报错 可以直接给total一个类型注解 但错误的根本是getTotal
  • Android 11 WebView 打开html文件,加载时报错:ERR_ACCESS_DENIED

    问题描述 之前andorid 10上做的需求 移植到android 11上 在项目中 system app HTMLViewer 自定义的加载html的xxxActivity java文件访问 手机系统中的 system etc html
  • 不使用MFC AppWizard向导, 如果没有设置好项目参数, 编译时产生错误及解决办法

    转贴 在创建MFC项目时 不使用MFC AppWizard向导 如果没有设置好项目参数 就会在编译时产生很多连接错误 如error LNK2001错误 典型的错误提示有 libcmtd lib crt0 obj error LNK2001
  • 频分复用和时分复用

    频分复用 FDM Frequency Division Multiplexing 就是将用于传输信道的总带宽划分成若干个子频带 或称子信道 每一个子信道传输1路信号 频分复用要求总频率宽度大于各个子信道频率之和 同时为了保证各子信道中所传输
  • 【深入理解C++】类对象所占用的空间大小

    文章目录 1 须知 2 非静态成员变量 普通成员变量 3 静态成员变量 4 非静态成员函数 普通成员函数 5 静态成员函数 6 构造函数和析构函数 1 须知 类本身是没有大小的 类的大小指的是类的对象所占的大小 如果用 sizeof 运算符