结构体对齐和补齐

结构体对齐补齐三原则 内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。(编译环境为vs2015) 对齐原则: 原则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较... 阅读详情

结构体的对齐和补齐的规则:
对齐:假定从零地址开始,每成员的起始地址编号,必须是它本身字节数的整数倍。
补齐:结构的总字节数必须是它最大成员的整数倍。
注意:在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算。

#include <stdio.h>
#pragma pack(4)//编译器按照4字节对齐 
typedef struct data
{
	char a[11];
	int b;
	char c;
	double d;
	short e;
}data;

int main()
{
	int size = sizeof(data);
	printf("%d\n",size);
	//计算出40字节是因为系统是64位的,默认8字节对齐 
	//默认4字节对齐,结果是32 
	return 0;
}

1、首先第一个成员 char a[11],char类型是占一个字节的,所以第一个成员结束的地址范围是0~10,占了11个字节。 注意:地址的范围是假定从0开始的。

2、然后是第二个成员int b,int类型是占了4个字节的,然后第二个成员的起始地址是11,然后我们发现11不是4的倍数,所以这个时候我们要考虑对齐规则,即让起始地址是4的倍数,所以这里int b的起始地址是12,地址范围是12~15占了4个字节。

3、接着看第三个成员char c,因为char是占了一个字节,所以不需要考虑补齐和对齐,所以第三个成员占的地址是16,就一个字节。

4、再来看第四个成员double d,首先这里要注意一点在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算,这里我们默认是Linux系统下,当然在一般在别的系统下也有这个规则。然后这里的起始地址是17,不是4的倍数,所以我们要考虑对齐规则,即让double d的起始地址变成20,然后这里还要注意一点,double是4字节只是在对齐的时候需要考虑,在计算大小是还是要改成原来的8字节,所以第四个成员占的地址范围是20~27,占了8个字节。

5、最后再看第五个成员short e,short是占了2个字节的。起始地址是28,发现是2的倍数,所以不用再对齐了,所以占的地址范围是28~29,占了两个字节。

最后这个结构体的地址范围是0~29,大小是30个字节,但是我们在计算结构体大小的时候还有一条规则,就是补齐。在这个结构中最大的成员的字节数是4(超过4字节按4字节算),30不是4的整数倍,所以最后这个结构体的大小还要增加2,最后的结果就是32。

本文是复制大佬的文章。
原文链接:https://blog.youkuaiyun.com/weixin_45372436/article/details/99630449

C语言——结构体内存对齐规则 C语言结构体内存对齐规则: 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 附1: 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 接下来楼主用一些例子来帮助大家理解结构体对齐规则(注:楼.. 阅读详情

相关推荐

结构体内存对齐及规则

内存对齐的意义 为什么要内存对齐: 内存的最小单元是一个字节;CPU实际上将内存当成多个块,每次从内存中读取一个块,这个块的大小可能是2、4、8、16等。 如果没有对齐,为了访问一个变量可能产生二次访问;有了内存对齐,可以提高操作系统访问内存的效率。 我们来分析下非内存对齐和内存对齐的优缺点在哪? 总结:结构体的内存对齐就是拿空间换时间的做法 平台原因(移植原因):某些硬件平台只能在某些地址处取某些特定类型的数据 否则抛出硬件异常 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐为了访问未

weixin_43408582的博客 769

结构体对齐和补齐(详细解释)

struct sum { char a[18]; double b; char c; int d; short e; }

程序员小明 1万+

内存对齐和内存补齐

1. 何为内存对齐,内存补齐 -内存对齐: 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身所占用的字节数中,两者比较小的那个进行对齐。 -内存补齐 在struct或者union数据成员完成各自对齐之后,struct或者union本身也要对齐,对齐按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行。先局部成员对齐,然后再全局对齐。 2.内存对齐优点 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。内存是一组一组读取的(4个一组或8个一组读取),为了访问未

ahupangjing的博客 665

【C语言】(详细)结构体的内存对齐(规则、存在原因、默认对齐数的修改等+实例分析)

详细的c语言结构体内存对齐知识! ①结构体内存对齐规则 ②为什么存在结构体内存对齐 ③修改默认对齐数 ④结构体成员排序 ⑤实例分析

卜及中的博客 5391

闲鱼虚拟商品自动发货神器XianYuAutoDeliveryX:从配置到对接大模型的完整指南

本文提供了一份关于闲鱼虚拟商品自动发货神器XianYuAutoDeliveryX的完整配置与实战指南。详细介绍了从环境搭建、账号安全配置到核心自动化流程的设置,并重点讲解了如何对接大语言模型API,实现智能对话回复,从而构建一套无人值守的闲鱼店铺自动化运营系统。

gray5的博客 1373

软件测试学习笔记(二)图覆盖

软件测试学习笔记(二)图覆盖 课程链接软件测试_中国大学MOOC 2.1 测试中的图 2.2 图覆盖准则 1、什么是图? 点的集合和边的集合。点或者结点,有穷非空的集合。边是点对。 2、图为什么在软件测试中具有重要地位? 所谓软件测试就是将软件变作一张图,然后覆盖它,不仅仅是软件,图更是计算机科学重要的结构。 3、软件测试中的图是如何得到的? 常见的图可以来自源代码,常见的是控制流图,还有各种各样...

DZFinder的博客 1420

LInux中结构体对象的对齐和补齐

结构体的对齐和补齐的规则: 对齐:假定从零地址开始,每成员的起始地址编号(从0开始),必须是它本身字节数的整数倍。 补齐:结构的总字节数必须是它最大成员的整数倍。 注意:在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算。 下面来举个例子: #include <stdio.h> typedef struct data { char a[11]; int b; char c; double d; short e; }data; int main() { int s

weixin_31175597的博客 318

从SN65HVD230芯片手册出发,手把手教你搞定3.3V CAN收发器电路(附典型应用图)

本文详细解析TI SN65HVD230芯片手册,指导完成3.3V CAN收发器电路设计。从关键参数解读到基础电路搭建,再到高级功能实现与EMC优化,提供完整的接口电路设计方案,并附典型应用图和故障排查指南,助力开发者提升CAN总线通信质量。

weixin_29997523的博客 508

linux内存对齐图,Linux C语言: 结构体内存对齐和补齐原理

结构体内存对齐系统:Linux 64位CenOS 7 GCC编译器内存对齐的表现typedef struct {int a; // 4 byteschar b[5]; // 5 bytesdouble c; // 8 bytesint d; // 4 bytesshort e; // 2 bytes}MemAlign;Sizeof(MemAlign) = 32单个参数计算总和为23个字节,而整个结...

weixin_33771816的博客 270

知识推理——TransE(知识表示、知识嵌入)

知识图谱嵌入/表示方法 TransE

missyoudaisy的博客 1831

R语言,charls数据库清洗、基线特征描述、logistics回归、rcs模型、森林图

【代码】R语言,charls数据库清洗、基线特征描述、logistics回归、rcs模型、森林图。

2402_87751128的博客 2513

内存对齐和补齐

  对齐:是针对单个成员变量的; 补齐:是针对摆放的所有成员变量的整体而言要对齐; //4字节的对齐粒度 //8字节的对齐粒度 #pragma  pack(8)       // #pragma pack(n) /* n = 1, 2, 4, 8, 16 */ struct     aa{       int     ma;      char   arr[5];      do...

一个编程菜鸟的成长路-(常人changr)的专栏 2453

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

结构体有字节对齐和字节补齐问题

关于结构体有一个字节对齐和字节补齐的问题 对齐原则是:分配空间要是该类型数据大小的倍数即为有char为1的倍数,有short为2的倍数, 有int为4的倍数,有double为8的倍数(关于int和double一般都是4的倍数) 补齐原则是:整个结构体变量的长度补成这里面最大的那个成员大小的倍数,如果大小超过4 就按4的倍数 所以你这个结构的大小具体要这样算 C/C++ co

madjoe的专栏 2192

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

YOLOv11损失函数进阶:融合SmoothL1与FocalLoss,让检测精度再涨10%的实战教程

在YOLOv11的这里的beta参数控制“L1与L2的过渡阈值”,默认设为1.0即可兼容多数场景。同样在# 计算动态alpha(基于类别样本数,需提前统计self.class_counts)# 交叉熵基础# FocalLoss权重else:使用前需统计数据集的(每个类别的样本数),并传入的alpha参数。损失函数是YOLOv11精度的“灵魂”——SmoothL1让边界框回归“稳、准、狠”,改进FocalLoss让类别分类“雨露均沾”。从代码改造到实战落地,本教程已为你搭建了一条精度跃升的路径。

m0_64661770的博客 213

数据存储_内存对齐和结构补齐

首先我们先看看下面的C语言的结构体: typedefstructMemAlign { inta; charb[3]; intc; }MemAlign; 以上这个结构体占用内存多少空间呢?也许你会说,这个简单,计算每个类型的大小,将它们相加就行了,以32为平台为例,int类型占4字节,char占用1字节,所以:4 + 3 ...

spdian的博客 633

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

结构体内存分配总结

结构体内存 的对齐:每个成员分配内存的时候都要放在自己的整数倍的位置上。超过四个字节的都按照4的整数倍对齐。数组类型的成员分配内存是由数组元素的类型来决定。对齐的好处:便于成员的寻址。坏处:有内存的浪费。 默认情况下结构都是对齐和补齐的。 什么是补齐:         结构每个成员分配好内存后,从内存数也要检测,结构的从内存数必须是结构中的最大成员的整数倍,如果成员大小超过4个字节,按4个字

wangxiaokang1_1的专栏 943

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C 结构体

结构体 1. 概念 创建新类型的工具 结构体类型的存储区里可以包含多个不同类型的子存储区,每个子存储区可以存放一个数字,甚至也可以是结构体类型的存储区 2. 声明方法 使用 struct 关键字声明 包含多个成员变量声明语句 struct 结构体类型名称 { 成员变量声明语句 }; #include <stdio.h> //结构体声明里虽然包含了多个变量声明语句,但...

xueHui 308

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

内存对齐和类、结构体大小计算

通过以上分析可以得出,在结构体中,不同的数据成员排序方式可能导致结构体的大小不一样。这就要求我们根据实际情况分析结构体的数据成员,以达到最优的定义方式。结构体对象使用少的时候可能只差几个字节的内存,这无关紧要。但是如果我们定义的是一个链表,链表元素是结构体方式定义的,当链表长度增大时,那这节省的内存空间就不可忽视了。结构体内存对齐字节数可以通过#pragma pack(n) 的方式来指定。如果某些时候我想4字节对齐,有些时候我又想8字节对齐,那么怎么解决这个问题呢?

weixin_40332490的博客 952

结构体指针,内容偏移

结构体指针,默认hui'yi

指尖◎假如 2441

C语言计算结构体占用字节大小总数

在学习C语言的时候很多人可能遇到了和我同样的问题,就是无法正确计算出C语言结构体所占字节的总的大小。首先,在开始计算结构体占用字节大小之前,我们要先搞懂什么是结构体的对齐和补齐。为什么会有结构体的对齐与补齐。 CPU的数据传输方式: CPU的数据传输方式是一次传输2个(32位)或者8个(64位)字节的方式进行传输(根据总线条数来确定),这里我们以64位系统来举例,如果你声明一个变量占用8个字节,且...

qq_42849332的博客 828

内存地址对齐

内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的(在32位系统中,数据总线宽度为32,每次能读取4字节,地址总线宽度为32,因此最大的寻址空间为2^30=4GB,但是最低2位A[0],A[1]是不用于寻址,A[2-31]才能存储器相连,因此只能访问4的倍数地址空间,但是总的寻址空间还是4GB,因此在内存中所有存放的基本类型数据的首地址的最低两位都是0,除

weixin_44713496的博客 1559

8.5结构体内存补齐和对齐

空间换时间

Raven1的博客 435
上一篇: 编程问题汇总
下一篇: MAKEWORD()函数
Cpp味的麻辣香锅
博客等级 码龄5年 43粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值