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

news2025/1/12 1:11:00

目录

一、计算结构体的大小

二、计算类的大小

三、内存对齐 


一、计算结构体的大小

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

二、计算类的大小

1.计算成员变量的大小

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

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


2.计算成员函数的大小

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


3.计算空类的大小

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


总结:

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

三、内存对齐 

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

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

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

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


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…

监控操作台为生活提供安全保障

在科技日新月异的现代社会,监控操作台已成为我们生活中不能缺少的一部分。它犹如一座城市的守护神,默默无闻地守护着我们的安全,确保着每一刻的平安。今天,和北京嘉德立一同走进这个神秘的世界,揭开监控操作台的神秘面…

(十四)Servlet教程——Servlet中HttpSession的使用

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,相应地也增加了服务器的存储压力。 1. 什么是Session Session是另外一种记录客户端状态的机制,不同的是Cookie保存在客户…

线程池嵌套导致的死锁问题

1、背景 有一个报告功能,报告需要生成1个word,6个excel附件,总共7个文件,需要记录报告生成进度,进度字段jd初始化是0,每个文件生成成功进度加1,生成失败就把生成状态置为失败。 更新进度语句&…

Vue入门到关门之Vue项目工程化

一、创建Vue项目 1、安装node环境 官网下载,无脑下一步,注意别放c盘就行 Node.js — Run JavaScript Everywhere (nodejs.org) 需要两个命令 npm---->pipnode—>python 装完检查一下,hello world检测,退出crtlc 2、搭建vu…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程(优先级从先到后) 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows:C:\Windows\System32\drivers\etc\hostsLinux:/etc/hosts 使用外部的域名解析服务器解析&#xff…

逆向第一步 去掉debugger(无任何门槛小白可学习)

准备工具 1.ReRes 地址:ReRes 用法: 用法 2.nodepad 地址:nodepad 注意下载后缀为.x64.exe版本的 我这里下的npp.8.6.5.Installer.x64.exe 3给nodepad装上JSTool插件 下载 可省略下叙详细步骤点此链接直接下载 JSToolNpp 然后到导…

Go语言基本语法(三)指针

什么是指针 在Go语言中,"指针是一种存储变量内存地址的数据类型",意味着指针本身是一个特殊的变量,它的值不是数据本身,而是另一个变量在计算机内存中的位置(地址)。形象地说,就像存…

Avalonia .NET构建Linux桌面应用

目录 👻前言 💻安装Avalonia 📦创建项目 📚在win下运行 ​🔑打包发布​编辑 📻在linux下运行 环境WIN10 VS2022 debian 👻前言 Avalonia 是一个用于创建跨平台用户界面 (UI) 的开源框架…

C++——STL容器——vector

vector是STL容器的一种,和我们在数据结构中所学的顺序表结构相似,其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组,支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器,应该…

对6个默认成员函数的总结

前言:本篇文章是对六大默认成员函数的自我总结,不适合刚入门的新人学习。适合想进一步深入了解六大默认成员函数的人学习。 1.构造函数:给对象初始化的函数,相当于之前写的Init函数。 构造函数的特性: 对内置类型不…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中,人工智能(AI)作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具,它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

day15 学一下Tailwindcss(java转ts全栈/3r教室)

目前距离全栈差得最多的是前端,而对于前端主要是CSS一直不熟悉,觉得很复杂写起来总是不上道,所以特别关注下Tailwindcss吧,其他前端框架可以先放放,多说无益直接用tailwindcss做个页面试试 看下文档:Tailwi…

【LeetCode刷题记录】104. 二叉树的最大深度

104 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入&#xff…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识,搭建一个可刷新的排行榜页面。在排行榜页面中,使用循环渲染控制语法来实现列表数据渲染,使用Builder创建排行列表布局内容,使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

回溯Backtracking Algorithm

目录 1) 入门例子 2) 全排列-Leetcode 46 3) 全排列II-Leetcode 47 4) 组合-Leetcode 77 5) 组合总和-Leetcode 39 6) 组合总和 II-Leetcode 40 7) 组合总和 III-Leetcode 216 8) N 皇后 Leetcode 51 9) 解数独-Leetcode37 10) 黄金矿工-Leetcode1219 其它题目 1) 入…

LeetCode45:跳跃游戏Ⅱ

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n …

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺&#xff08;工艺路线Routing&#xff09;。 SAP PP学习笔记07 - 作业手顺&#xff08;工艺路线Routing&#xff09;-CSDN博客 这一章来讲讲作业区&#xff08;工作中心 Work Center&#xff09;。 1&#xff0c;作业区&#xff08;工作中心&#xff09;中…

Linux挂载硬盘

1、查看硬盘数量 fdisk -l # 可以看到三个磁盘 # /dev/vda 50G # /dev/vdb 100G 新增 # /dev/vdc 100G 新增2、查看当前挂载情况 df -h # 可以看到50G的已经挂载3、格式化待挂载盘 # 对新的数据盘进行挂载前要进行格式化&#xff0c;只有格式化后才可以挂载 mkfs.ext4 /dev/…