结构体内存对齐 & 联合体大小计算

C/C++内存对齐规则(结构体、联合体、类) 本篇博客介绍了内存对齐的规则,包括结构体嵌套结构体、结构体嵌套数组的例题;介绍了如何求union联合体的内存大小;还介绍了如何计算C++的类的内存大小 阅读详情

一:结构体内存对齐规则

  • 1.第一个成员在结构体变量偏移量为0的地址处。

  • 2.从第二个成员变量开始,要对齐到对齐数的整数倍 地址处。
    对齐数 就是 编译器默认的一个对齐数 与 该成员大小中的 较小的那一个。

    • VS编译器默认的对齐数是8(字节), Linux中默认对齐数是4
  • 3.结构体总大小 是每个成员变量的对齐数 中最大的对齐数的整数倍。

  • 4 如果结构体中嵌套了另外一个结构体,那么就把这个嵌套在里面的结构体当成外面结构体的一个成员,里面的结构体的对齐到自己的最大对齐数的整数倍,(这时里面的结构体也有一个最大对齐数,把这个对齐数就当做里面的结构体的对齐数),所以整体大小就是最大对齐数的整数倍。

  • 注意:32位平台下,vs的默认对齐数是4字节,但是在64位平台下,vs的默认对齐数是8字节。

二:内存对齐的大小计算

在这里插入图片描述

如何修改默认对齐数:

修改默认对齐数: 使用 #pragma pack(n)
恢复默认对齐数: 使用 #pragma pack()

修改默认对齐数后的结构体大小:
在这里插入图片描述

//穿插一个结构体只是验证
struct S
{
	float f;  //4   ---4
	short s;   //2    ---2(4)
	int i;     //4    ----4
	double d;    //8  ----8(4+8)
	char c;   //1      ----1
	int a[4];  //16   ----16(3+16) 
			                  //4+4+4+12+1+19=44,  结构体大小应该是48,经过验证,结果正确
};


struct B
{
	float f;  //4   ---4
	short s;   //2    ---2(4)
	int i;     //4    ----4
	char c;   //1      ----1
	char a[7];  //7   ----7  ---对齐数是1,不是7,说明了数组的对齐数是对应元素的类型大小,而不是数组的大小
							  //4+4+4+1+7=20,  结构体大小应该是20,经过验证,结果正确
};


int main()
{
	int a[4];
	cout << sizeof(S) << endl;    //40
	cout << sizeof(B) << endl;    //20

	cout << sizeof(float) << endl;   //4
	cout << sizeof(short) << endl;   //2
	cout << sizeof(double) << endl;  //8
	cout << sizeof(a) << endl;      //16
	return 0;
	}

三:结构体内存对齐原因

为什么要有结构体内存对齐?
原因:
(1)方便移植,因为不是所有的硬件平台都能任意访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常。
(2)有利于性能的提升,如果内存没有对齐,处理器需要做两次内存访问;而对齐的内存的访问仅需要一次。所以数据结构应该尽可能的在自然边界上对齐。
(3)内存对齐实质上是一种以空间换区取时间的做法,因此在设计结构体的时候,应该既要满足对齐,又要节省空间,可以采取让占用空间小的成员尽可能的其中在一起。



联合体(共用体)

1.定义:

联合体是一种特殊的自定义类型,联合体变量包含一系列成员,这些成员公用同一份内存空间。

//联合体的声明
union Un
{
		int a;
		char b;
}

//联合体的定义
union Un un;   //un就是联合体变量

//计算联合体大小
printf("%d\n",sizeof(un));

2.联合体大小的计算规则:

满足以下两点:

  • 联合体的大小 >= 最大成员的大小
  • 当最大成员大小不是最大对齐数的整倍数时, 要对齐到最大对齐数的整数倍(对齐的结果是超过并接近最大成员大小)。
例如:求联合体Un1的大小?在这里插入图片描述
分析:

1.变量c 是个短整型数组,有七个元素,大小是14字节,vs编译器默认的对齐数是8字节,所以两者最终的对齐数(取较小的对齐数作为变量的对齐数)是8字节。
2.变量i 是个整型变量,大小是4字节,vs编译器默认的对齐数是8字节,所以最终变量i的对齐数是4字节。
3.所以,整个共用体的最大对齐数为变量c的对齐数----8。但是考虑到最大成员的大小14不是8的倍数,所以要对齐到8的整数倍----16。

内存对齐问题(结构体,联合体,位段) 结构体 typedef struct A { char c1; char c2; int i; }A; typedef struct B { char c1; int i; char c2; }B; typedef struct C { int i; char c1; char c2; }C; 对于结构体A,B,C.它 阅读详情

相关推荐

Eplan P8自动线号生成全攻略:从电位定义点到连接编号的完整流程

本文详细解析了Eplan P8自动线号生成的全流程,从电位定义点的创建配置到连接编号的标准化管理,帮助电气设计人员提升图纸规范性和工作效率。重点介绍了自动编号方案的定义与调整技巧,以及企业级标准化实施建议,是掌握Eplan P8自动线号功能的实用指南。

weixin_29254029的博客 508

关于结构体、联合体大小的计算

前言 本文是介绍有关 C 语言中,结构体,联合体的大小计算方法。下面通过结合实例来加以理解它们是如何进行计算大小的。以下实例均在 VS 2017 环境中进行验证。如有出错或理解有误的地方,欢迎评论指出~ 注:                        数据类型          所占字节 (VS x86 环境 )                            cha...

关于结构体、联合体大小的计算 7385

微信内置浏览器抓包全攻略:从ADB配置到Chrome调试(附常见问题解决)

本文提供了一套完整的微信内置浏览器抓包与调试解决方案。从ADB工具的深度配置与稳定性连接开始,详细讲解了如何开启X5内核调试开关,并利用Chrome DevTools建立远程连接。文章重点剖析了Network面板进行网络请求抓取、性能分析和问题定位的实战技巧,并附带了设备连接失败、无网络请求等常见问题的排查指南,帮助开发者高效解决微信H5页面调试难题。

gitlab7runner的博客 541

结构体、位段、枚举、联合体大小的正确计算方式

对于结构体、位段、枚举、联合体大小的计算,这里先给出四道题目,答案在文末公布,如果你都做对了,说明你对自定义类型大小的计算没什么问题了,就没有继续看这篇文章的必要了。注:对齐数默认为8(一)结构体 struct s1 {double d1;char c1;int i;char c2;double d2;(二)位段 struct s3 {char a : 2;char b : 4;char c : 5;char d : 4;0 };s3 . c = 3;

m0_74494481的博客 347

华为昇腾服务器npu中安装paddle,pytorch等环境,训练代码迁移适配等问题记录

参考文档:https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/npu/README_cn.md

qq_29220369的博客 4112

EtherCAT-7 从站代码移植-SPI

STM32F103 + AX58100,从站代码移植。

tianya_xuan的博客 3565

C语言结构体大小;结构体嵌套结构体大小的计算方法分析

C语言结构体大小;结构体嵌套结构体大小的计算方法分析

m0_70088853的博客 1443

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 473

【C语言】关于内存对齐以及结构体和联合计算大小

原来计算结构体大小这么简单,知一会百解千愁,快来see see吧!!!

m0_74452600的博客 348

【头歌educoder】离散数学实训参考-第二章-关系-part1-关系基础

python实现离散数学-关系基础-二元关系

wander_alice的博客 8462

Colab虚拟环境配置全攻略:从安装到实战应用

本文详细介绍了在Google Colab中配置Python虚拟环境的完整流程与实战技巧。通过安装Anaconda、创建独立环境、解决常见错误及结合深度学习项目应用,帮助用户有效管理依赖、避免冲突,并利用环境持久化策略提升在Colab中的开发效率与项目可复现性。

weixin_29204121的博客 339

sizeof()计算嵌套结构体

学习此资料指南 不用看各种头文件 先从test::run2()极其前后注释看起 然后如果想要深入学习,可以看test::run()中的Variadic_template实现递归复合的sizeof()求解,太细的东西暂时看不懂没关系,其实只用看数据,他就相当于run2()中的struct嵌套struct #include&lt;bits/stdc++.h&gt; using namespace ...

单林敏的博客 991

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

2023年高教社杯 | 2023年高教社杯全国大学生数学建模思路(A题思路、C题思路)

前程算法屋的博客 622

【C语言】结构体内存对齐&计算联合体大小

数据是按顺序一个一个放到内存中去的,但并不是紧密排列的。

Hush_H的博客 1341

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex&trade;-M4F 内核的信息,请参见《Cortex&trade;-M4F 技术参考手册》。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)

同学可以尝试将char f 注释,最后将得到24,也可以从侧面说明再加上一个char f,其大小肯定大于等于24 byte。Test3中的最大数据成员大小比成员结构体Test内部最大成员大小要小,这时规则3是按照。sizeof的大小是24,即满足容下a[20],同样24是b、c和d的倍数,规则3。sizeof的大小是20,即a[20]的大小,同样20是b和c的倍数,规则3。s中char ch1;占用 1Byte(存储位置8)的,sizeof的结果是40。最大元素大小的整数倍地址。

DayDayUp 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

结构体大小如何计算?

以下内容摘自此处: 作者:太平小小草 链接:https://www.jianshu.com/p/e772fff47465 来源:简书 结构体大小计算有三个原则: 一,结构体变量的首地址,必须是结构体 "最宽基本类型成员" 大小的整数倍(0被认为是任何数的整数倍)。 二,结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍。 三,结构体的总大小,为结构体 “最宽基本类型成员” (将嵌套结...

椰树林YSL的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an &ldquo;advanced algorithms&rdquo; book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

结构体及联合体大小计算

结构体大小的计算的依据是结构体1.结构体的2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。VS 中默认的值为 8Linux中gcc没有默认对齐数,对齐数就是成员自身的大小)3.结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。

2302_80046302的博客 1918

C语言 计算结构体大小

前言 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。 结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。 如何计算结构体大小 以下面这个结构体为例: struct S { double d; char c; int i; }; 使用 sizeof(struct S) 计算其大小发现结果是16,并不是doubl

a只如初见的博客 9369

结构体对齐计算(超详细讲解,一看就会)

超细节,进来必会!!!

L_ZF01的博客 5646

结构体struct和联合体union最全讲解

摘要:首先感谢三位博主,并做出总结.首先了解一下struct的储存结构:一、结构体的访问1.结构体成员的的直接访问,如下结构体:struct  A{           int a;           long *b;           char c[20];};struct A   com;结构体成员通过操作符&quot;.&quot;访问,表达式com.a的结果是个数组名,可以把它使用在任何可以使用数组名的地...

liguangxianbin的博客 7万+

c语言:结构体与联合体的大小(嵌套)

计算结构体与联合体(嵌套)大小

qq_48335434的博客 4100

结构体/联合体大小的计算

结构体和联合体的大小计算含详细过程

qq_66314292的博客 2588

计算结构体,位段,联合体(共用体)的大小

图解结构体大小,位段大小,联合体大小

qq_27183803的博客 2587

结构体内存对齐与联合体

当我们了解结构体的声明,结构体的自引用,结构体变量的定义和初始化,如何计算结构体的大小呢?结构体类型的数据是在内存中如何存放的呢?以及是否可以在同一块存储空间储存不同的数据类型?这也是本文需要讨论的问题;

m0_58963318的博客 792

结构体||联合体

int age;;int age;}stu1;·匿名结构体如果没有对结构体进行重命名的话,基本上只能使用一次。·结构体定义不分配地址,结构体变量会分配地址。·结构体变量的声明必须在主函数上或者主函数中位段的目的:节省空间struct Aint _a:2;int _b:5;////这里的数字是指比特位(bit)int _c:10;int _d:30;A就是位段的类型。位段A所占大小为8字节(原理。

2301_78670085的博客 2192

计算结构体大小:内存对齐详解

对于同样的结构体成员,他们相互之间的顺序位置不同就会导致整个结构体大小的不同,本文旨在探讨为什么会出现这样的情况,以及如何计算结构体的大小

luming的博客 376
上一篇: 静态通讯录
下一篇: 二叉搜索树
Name_seven
博客等级 码龄9年 12粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值