「C/C++ 01」计算结构体/类的大小和内存对齐

目录

一、计算结构体的大小

二、计算类的大小

三、内存对齐 


一、计算结构体的大小

        计算结构体的大小要遵循内存对齐规则:即从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个结构体也必须要对齐:结构体的大小必须是默认对齐数的整数倍。

二、计算类的大小

1.计算成员变量的大小

        类和结构体的一样,也遵守内存对齐规则,从第二个成员变量开始,起始位置要计算,在自己的大小和默认对齐数(VS编译器中默认对齐数为8)中选择较小的那个,起始位置为其倍数。最后整个类也必须要对齐:类的大小必须是默认对齐数的整数倍。

        当sizeof计算类的大小的时候会忽略静态成员变量的大小。


2.计算成员函数的大小

        算类的大小时,不用考虑成员函数,故不用加上函数指针的大小。


3.计算空类的大小

        注意,没有成员变量的类(包括空类)的大小为1字节,不存储数据,目的是为了占位,标识对象存在,区分不同的对象。


总结:

        计算类的大小就是按照内存对齐的方式计算类中所有(非静态)成员变量 的大小。

三、内存对齐 

        在编程中,内存对齐是一种提高内存访问效率的方法。简单来说,内存对齐就是将数据存储在特定的地址,这个地址是某个特定数值(对齐数)的整数倍。这样做的好处是可以提高CPU的内存访问效率,因为CPU访问内存时是按块进行的,如果数据没有对齐,CPU就需要多次访问内存才能获取到完整的数据,而如果数据对齐,CPU就可以一次访问就获取到完整的数据。

        在C++中,类和结构体也会遵守内存对齐规则。每个成员变量在内存中的位置都会从其上一个成员变量结束后起始位置的某个倍数开始。这个起始位置的计算方式是:取默认对齐数(在VS编译器中默认对齐数为8)和自己的大小中的较小值,然后选择这个数的整数倍作为起始位置。

        同时,整个类的大小也必须是对齐数的整数倍。这是因为如果类的大小不是对齐数的整数倍,那么在访问这个类的对象时,CPU就可能需要多次访问内存才能获取到完整的数据。

这种内存对齐的方式可以提高CPU的内存访问效率,但是它也会导致一定的内存浪费。因为即使有些成员变量之间有空隙,这些空隙也不能被利用。所以,内存对齐是一个权衡内存使用效率和内存访问效率的问题。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/585461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】IP-guard WebServer 权限绕过漏洞

0x01 产品简介 IP-guard WebServer 是 IP-guard 网络安全管理系统的一部分,用于提供 Web 界面以进行用户权限管理、监控和审计。 0x02 漏洞概述 IP-guard WebServer的权限验证机制中存在设计缺陷,未授权的攻击者能够规避安全验证,通过后端接口执行文件的任意读取和删除操…

Docker数据管理和Dockerfile

目录 一.数据管理 1.作用 (1)修改配置文件例如,nginx.conf /usr/local/nginx/conf/nginx.conf —>/container_nginx/conf/nginx.conf (2)容器内部产生的日志,如何收集将容器内部存方日志文件的目录挂…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件(component)1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

Adobe推出AI视频超分辨率工具VideoGigaGAN

🦉 AI新闻 🚀 Adobe推出AI视频超分辨率工具VideoGigaGAN 摘要:Adobe公司最新推出的AI工具VideoGigaGAN,利用上采样技术将视频分辨率从128128提升至10241024。这一工具基于GigaGAN模型开发,专注于生成视频超分辨率&am…

OpenHarmony实战开发-属性样式动画

在关键帧&#xff08;Keyframes&#xff09;中动态设置父组件的width和height&#xff0c;实现组件变大缩小。子组件设置scale属性使父子组件同时缩放&#xff0c;再设置opacity实现父子组件的显示与隐藏。 <!-- xxx.hml --> <div class"container"><…

Objenesis 底层探究

Objenesis 简介 Objenesis 是一个 Java 库&#xff0c;用于在不调用构造方法的情况下创建对象。由于绕过了构造方法&#xff0c;所以无法调用构造方法中的初始化逻辑。相应的&#xff0c;Objenesis 无法创建抽象类、枚举、接口的实例对象。 起源 与其称之为起源&#xff0c;…

【笔试训练】day15

1.平方数 水题直接看代码 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; int main() {ll x;cin >> x;ll a sqrt(x);if (abs(a * a -…

【Unity动画系统】动画状态转换详解

动画状态转换 此空处可以改换新转换名字。 表示有多个转换&#xff0c;播放顺序不可调整。 Solo:表示只执行它们&#xff0c;其他没勾选的不考虑&#xff1b;都勾选了&#xff0c;哪个转换条件先满足&#xff0c;就先执行哪个转换;如果同时满足&#xff0c;那就按顺序执行。 M…

【数据结构】顺序表专题

前言 本篇文章我们来进行有关顺序表的专题训练&#xff0c;让我们一起来看一下有关顺序表的算法题 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 &#x1f4dd;若有问题 评论区见 &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.移除…

Python urllib 爬虫入门(1)

本文主要为Python urllib类库函数和属性介绍及一些简单示例。 目录 urllib爬取网页 简单示例 写入文件 其他读取方法 readline函数 readlines函数 response属性 当前环境信息 返回状态码 返回url地址 对url进行编码与解码 写入文件 总结 urllib爬取网页 通过pyth…

牛客网刷题 | CC1 获取字符串长度

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 键盘输入一个字符串…

Leetcode297_二叉树的序列化与反序列化

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xf…

redis故障中出现的缓存击穿、缓存穿透、缓存雪崩?

一、背景&#xff1a; 在维护redis服务过程中&#xff0c;经常遇见一些redis的名词&#xff0c;例如缓存击穿、缓存穿透、缓存雪崩等&#xff0c;但是不是很理解这些&#xff0c;如下就来解析一下缓存击穿、缓存穿透、缓存雪崩名词。 二、缓存穿透问题&#xff1a; 常见的缓存使…

RTMP 直播推流 Demo(一)—— 项目配置与视频预览

音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…

使用JNI机制加载本地方法的小案例

JNI 最近在学习Android&#xff0c;其中需要使用到c的库&#xff0c;这个时候就要使用到JNI机制了&#xff0c;简单来说&#xff0c;就是可以通过这个机制&#xff0c;让java代码可以调用本地c语言编写的代码&#xff0c;将c语言编写的代码打包成动态库&#xff0c;然后&#…

Java面试重点之反射机制

一、 反射是什么&#xff1f; 允许程序在运行时查询和操作对象的类型信息。通过反射&#xff0c;程序能够在运行时获取对象的类定义信息&#xff0c;如类的名称、方法、字段、注解等&#xff0c;并且可以动态地调用对象的方法或访问其字段&#xff0c;而无需在编译时具体知道对…

CarEye 智能叉车管理系统

CarEye 团队在智能车辆管理平台基础上&#xff0c;专门针对叉车管理特殊性开发了叉车管理系统。以下是叉车管理系统的一些主要介绍&#xff1a;

跟TED演讲学英文:Innovating to zero! by Bill Gates

Innovating to zero! Link: https://www.ted.com/talks/bill_gates_innovating_to_zero Speaker: Bill Gates Date: February 2010 文章目录 Innovating to zero!IntroductionVocabularyTranscriptQ&A with Chris AndersonSummary后记 Introduction At TED2010, Bill Ga…

深度学习突破:LLaMA-MoE模型的高效训练策略

在人工智能领域&#xff0c;大模型&#xff08;LLM&#xff09;的崛起带来了前所未有的进步&#xff0c;但随之而来的是巨大的计算资源需求。为了解决这一问题&#xff0c;Mixture-of-Expert&#xff08;MoE&#xff09;模型架构应运而生&#xff0c;而LLaMA-MoE正是这一架构下…

环形链表题

1.环形链表1 看题&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;哈希表 遍历所有节点&#xff0c;每次遍历一个节点时&#xff0c;判断该节点是否被访问过。 可以使用哈希表来存储所有已经访问过的节点。每次到达一个节点&#xff0c;如果该节点已…