C-结构体对齐

结构体对齐(Struct Alignment):是计算机编程中的一个概念,通常用于描述编译器如何安排结构体的成员在内存中的存储方式。

在很多计算机体系结构中,访问未对齐的数据可能会导致性能下降,甚至是程序崩溃。为了优化内存访问,编译器会对结构体进行对齐,即按照某种规则将结构体的成员排列在内存中,以便于有效地访问。这种对齐通常是根据硬件平台的要求来进行的。

具体对齐值的设置以及对齐值的用处我们在实际例子中进行阐述。

举个例子,设置如下结构体:

typedef struct _INFO {char szValue[6];float fValue;double dbValue;short sValue;int nValue;char cValue;
}Info,*Info;

定义完结构体后使用sizeof()计算该结构体的大小:

int main()
{   printf("sizeof Info:%d", sizeof(Info));system("pause");}

这个结构体的大小是如何计算而来的呢?

这个时候就需要引出一个概念

成员偏移量:
结构体成员偏移量(Struct Member Offset)指的是结构体中每个成员相对于结构体起始地址的偏移量。这个偏移量表示了该成员在内存中的存储位置。

那么现在我上面的结构体进行初始化,根据内存中的内容进行计算。

Info info = { "wolve",12.5f,100.5,0xAAAA,0xBBBBBBBB,'c' };

打个断点,进行内存查看。

内存的内容如下(以32位的格式进行排列)

实际的内容在c(ascii = 63)处结束;

77 6f 6c 76
65 00 cc cc
00 00 48 41
cc cc cc cc 
00 00 00 00 
00 20 59 40 
aa aa cc cc 
bb bb bb bb 
63

发现目前结构体的存储内容所需要的实际内存只有33字节,并且编译器在某些地方会自动补入cc字符进行填充。这个结果其实就是由结构体的成员偏移量引起的。

成员偏移量的计算公式
member offset % min(ZpValue,sizeof(member type)) == 0;

member offset:表示结构体成员偏移量;

ZpValue:表示对齐值;

对齐值可以在Visual Studio中进行设置。

MVSC默认对齐是8

min():取后面数列最小值;

sizeof(member type):成员类型大小;

min(ZpValue, sizeof(member type))表示 ZpValue 和成员类型大小中的较小值。

% : 表示取模运算符,即取偏移量除以最小对齐值和成员类型大小之间的较小值的余数。

==0:表示取模的结果必须为 0,即偏移量必须能够整除最小对齐值和成员类型大小之间的较小值。

介绍完公式后继续以上述内存中的内容为例子进行演示:
内存:
77 6f 6c 76
65 00 cc cc
00 00 48 41
cc cc cc cc 
00 00 00 00 
00 20 59 40 
aa aa cc cc 
bb bb bb bb 
63
结构体:
typedef struct _INFO { //格式:成员偏移量char szValue[6];   //0float fValue;      //理论偏移量:6;实际偏移量:member offset % min(8,4) == 0; 在计算的时候先将理论偏移量带入(member offse) =>  6 % 4 == 0? 显然6除以4取余不为0,那么这个时候就持续在理论偏移量上+1,直到偏移量为8的时候,余为0,这个时候float类型成员实际成员偏移量为8(在上述内存的内容中已经体现);接着在该基础上继续计算后续几个类型的成员偏移量。double dbValue;  //理论偏移量:8+4=12,实际偏移量:16  因为16 % min(8,8) == 0(所以double在第17字节开始存储)short sValue; //理论偏移量:16+8=24 ,实际偏移量:24 因为 24 % min(8,2) == 0(所以short在第15字节位置开始存储)int nValue;  //理论偏移量:24+2=26,实际偏移量:28 因为 28 % min(8,4) == 0(所以int成员在第28字节位置开始存储)char cValue; //理论偏移量:28+4=32,实际偏移量:32 因为 32 % min(8,1) == 0(所以int成员在第28字节位置开始存储)
}Info,*Info;
​
最后实际偏移32 + 1 (char成员大小) == 33 (得到实际存储成员所用的大小)
​
偏移量:在该数据前面存储着多大的数据

但是为什么sizeof()函数在计算结构体大小的时候得到的值是40呢?

原因在计算整个结构体大小的时候还需要满足另外一个公式:

Struct size % Max(Member type) == 0
​
​
这个表达式描述了结构体的大小必须是结构体中最大成员的大小的倍数。
​Struct size 表示结构体的总大小。Max(Member type) 表示结构体中成员类型的最大大小。
​
因此,这个表达式确保了结构体的大小能够容纳结构体中最大的成员,并且结构体的布局能够在内存中正确对齐,从而避免了浪费内存空间和可能导致的对齐问题。
这个时候我们接着带入计算
Struct size = 初步等于33(也就是刚才计算出来的结构体实际存储空间大小)
Max(Member type) = 8 (该结构体中成员最大类型宽度)
​
33 % 8 == 0 ?    很显然33除以8余数不为0,那么还是一样持续+1,指导Struct Size结构体大小为40时可以整除8;
所以sizeof()计算出该结构体大小为40。

最后,该结构体实际在内存中存储为:

77 6f 6c 76 65 00 cc cc 00 00 48 41 cc cc cc cc 00 00 00 00 00 20 59 40 aa aa cc cc bb bb bb bb 63 cc cc cc cc cc cc cc cc

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rsync 远程同步----------安全高效的异地备份策略

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器-------…

Spring源码解析-容器基本实现

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…

HTTP 常见的状态码以及其适用场景

是什么 HTTP状态码(英语:HTTP Status Code),用以表示网页服务器超文本传输协议响应状态的3位数字代码 它由 RFC 2616规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774与 RFC 4918等规范扩展 简单来讲&#…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提,本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵,所以要先生成两个bram核,用于缓存前两行图像数据 在 IP catalog中选…

【LeetCode热题100】74. 搜索二维矩阵(二分)

一.题目要求 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,…

特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…

CentOS7.9.2009安装elasticsearch7.11.1(单节点)

本文章使用CentOS7.9.2009服务器安装elasticsearch7.11.1软件 1.服务器信息 [root@elasticsearch ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@elasticsearch ~]# [root@elasticsearch ~]# cat /etc/hosts | grep elasticsearch 192.168.10.24…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

windows一键休眠,一键唤醒

1.使windows睡眠不可用&#xff0c;cmd以管理员身份运行&#xff1a; powercfg.exe /hibernate off 2.桌面创建快捷键 Rundll32.exe Powrprof.dll,SetSuspendState Sleep

探索7个MAMP本地开发环境的高效替代软件

什么是本地开发环境 本地开发环境是Web开发环境中的一种类型&#xff0c;它是指开发者自己的计算机上配置的一套用于开发和测试网站或应用程序的软件集合。这套环境使得开发者可以在本地计算机上构建和测试网站&#xff0c;而无需实时部署到服务器。 创建本地开发环境有两种方…

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

【单源最短路 图论】882. 细分图中的可到达节点

作者推荐 视频算法专题 本文涉及知识点 单源最短路 图论 LeetCode 882. 细分图中的可到达节点 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间…

编程杂谈-代码review

目录 1. 关于智商 2. 关于能力 3. 关于changelist 3.1 关于CL内容编写 3.2 关于CL的大小 3.3 处理审稿人的意见 4. 关于代码审查 一个人的编程能力怎么去衡量&#xff1f;特别是在面试中&#xff0c;怎么避免“高分低能儿”、“专业做题家”、“面试造火箭”&#xff0c…

【JavaEE】_Spring MVC项目获取Session

目录 1. 使用servlet原生方法获取Session 1.1 错误获取方法 1.2 正确获取方法 2. 使用Spring注解获取Session 3. 使用Spring内置对象获取Session 1. 使用servlet原生方法获取Session .java文件内容如下&#xff1a; setSession方法用于设置Session对象的内容&#xff1b;…

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】

LeetCode-74. 搜索二维矩阵【数组 二分查找 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;先二分查找行&#xff0c;再二分查找列。解题思路二&#xff1a;暴力遍历&#xff0c;也能过。解题思路三&#xff1a;用python的in。 题目描述&#xff1a; 给你一个满足下述两条…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 一、简单介绍 二、简单视频倒放效果实现原理 三、简单视频倒放效果案例实现…

切比雪夫窗函数

Skip to content 产品解决方案学术支持社区活动 获取 MATLAB登录到您的 MathWorks 帐户 Help Center 搜索帮助中心 帮助中心 Off-Canvas Navigation Menu Toggle Documentation Home Signal Processing Signal Processing ToolboxSpectral AnalysisWindows chebwinON…

JetBrains IDE 2024.1 发布 - 开发者工具

JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具 CLion, DataGrip, DataSpell, Fleet, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, Rider, RubyMine, WebStorm 请访问原文链接&#xff1a;JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具&#xff0…

51单片机里面的白盒测试中

白盒测试说直白点就是&#xff0c;加入一个盒子&#xff08;中间模块&#xff09;&#xff0c;使得测试的数据可视化&#xff0c;知道是内部是怎么运作的 场景&#xff1a;51单片机与WIFI模块通信&#xff0c;不能知道他们之间到底发没发数据&#xff0c;所以引出白盒测试 测试…