Struct 和 Union区别

struct和union的区别和存储方式 结构体struct是存储多个数据对象的内存块,这些对象不重叠。union是一块内存,用于存储多个数据对象,但只能存储其中最大的一个,因此在任何时候只能存储一个数据对象。 union和 struct 之间的主要区别在于 union 成员覆盖彼此的内存,因此 union 的 sizeof = 1 ,而 struct 成员一个接一个地分布在内存里(在可选的填充之间分布)。union也足够大以包含其所有成员,并且具有适合其所有成员的对齐方式。假设 int 只能存储在 2 个字节的地址并且是 2 个字节的宽度,而 l 阅读详情

原文地址:http://blog.youkuaiyun.com/firefly_2002/article/details/7954458

本人菜鸟,学习中,最后有改动,自我理解部分,如有错误,请参考原文或通知我,不胜感激

一、Struct 和 Union有下列区别:

1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。

2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。

3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。

注:在很多地方需要对结构体的成员变量进行修改。只是部分成员变量,那么就不能用联合体Union,因为Union的所有成员变量占一个内存。eg:在链表中对个别数值域进行赋值就必须用struct.

 

二、实例说明

struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式。

 

union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union的内存size 由类型最大的元素 size 来确定,如下的内存就为一个double 类型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1

}x;

所以分配的内存 size 就是8 byte。

既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

eg:  Sample联合只包含其中某一个成员,要么是index,要么是price。

union Sample{

   int index;

   double price; };

若  Sample ss; ss.index=10;// 从今往后只能使用ss.index

若  Sample ss; ss.price=14.25;// 从今往后只能使用ss.price

 在union的使用中,如果给其中某个成员赋值,然后使用另一个成员,是未定义行为,后果自负。

struct成员是互相独立的,一个struct包含所有成员。

C/C++ code
struct Example
{
int index;
double price;
};

Example结构包含两个成员,修改index不会对price产生影响,反之亦然。
union的成员共享内存空间,一个union只包含其中某一个成员。

说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用struct和union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用union,从而节省内存size; struct和union还可以相互嵌套。

 

三、内存对齐方式

union u
{
 double a;
 int b;
};

union u2
{
 char a[13];
 int b;
};

union u3
{
 char a[13];
 char b;
};

cout<<sizeof(u)<<endl; // 8
cout<<sizeof(u2)<<endl; // 16
cout<<sizeof(u3)<<endl; // 13

  都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。

  结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。

顺便提一下CPU对界问题,32的C++采用8位对界来提高运行速度,所以编译器会尽量把数据放在它的对界上以提高内存命中率。对界是可以更改的,使用#pragma pack(x)宏可以改变编译器的对界方式,默认是8。C++固有类型的对界取编译器对界方式与自身大小中较小的一个。例如,指定编译器按2对界,int类型的大小是4,则int的对界为2和4中较小的2。在默认的对界方式下,因为几乎所有的数据类型都不大于默认的对界方式8(除了long double),所以所有的固有类型的对界方式可以认为就是类型自身的大小。更改一下上面的程序:

#pragma pack(2)
union u2
{
 char a[13];
 int b;
};

union u3
{
 char a[13];
 char b;
};
#pragma pack(8)

cout<<sizeof(u2)<<endl; // 14 由于手动更改对界方式为2,所以int的对界也变成了2,u2的对界取成员中最大的对界,也是2了,所以此时sizeof(u2)=14。
cout<<sizeof(u3)<<endl; // 13 ,char的对界为1

   结论:C++固有类型的对界取编译器对界方式与自身大小中较小的一个。

 

struct的sizeof问题

  因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)
struct s1
{
 char a;
 double b;
 int c;
 char d;
};

struct s2
{
 char a;
 char b;
 int c;
 double d;
};

cout<<sizeof(s1)<<endl; // 24
cout<<sizeof(s2)<<endl; // 16

 同样是两个char类型,一个int类型,一个double类型,但是因为对界问题,导致他们的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,CPU判断结构体的对界,根据上一节的结论,s1和s2的对界都取最大的元素类型,也就是double类型的对界8。然后开始摆放每个元素。

  对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素d是double类型,要放到8的对界上,离1最接近的地址是8了,所以d被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是4,16可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素d需要对界1,也正好落在对界上,所以d放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24。

  对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。

 

特例:

#include<stdio.h>

union{

int i;

char x[2]; }a;

voidmain()

{

a.x[0]=10;

a.x[1]=1;

printf("%d",a.i);

 }


以下与原文有所改动·········································

在联合体a中定义了两种数据类型,sizeof(a)=4;字符数组x以及整形变量i.其中整形变量是32位的,数组大小为2的字符数组为8X2=16位,char型占一个字节。如此一来,编译器便会为联合体a在内存中开辟一个32位的空间,这个空间里存储联合体的数据,但是这个空间只有32位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。  
  以你的程序为例子,现在已经开辟了一个32位的空间,然后我们假定现在空间还没有被赋值,为:  
  00000000 00000000  00000000 00000000
  那么在运行完代码  
  a.x[0] = 10;  
  a.x[1] = 1;  
  之后,16位的空间变为:  (系统按低字节序)
  00000101 (低字节)

  00000001 

  00000000 

  00000000  (高字节)
  然后程序运行  
  printf("%d",a.i);  
  就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这32位变成了一个完整的整数:  
  (00000001 00000101)二进制 =0x01 0A(十六进制)= (266)十进制 


union和struct 共用体union与结构体struct的区别 union:使不同类型变量共同占用同一段内存 struct:把不同类型的数据组合成一个整体--自定义数据类型 union abc{ int i; char m; }; 1、在联合体中,i和m共用一个内存位置。 2、当一个联合体被说明时,编译程序会产生一个变量,其长度为联合体中最大的变量长度。 结构 阅读详情

相关推荐

Palantir解密:从企业数字化能力构成说起,“本体”如何破解现代企业数据应用难题?

抛开技术外壳来看,Palantir“本体”的理念内核其实并不复杂:构建一个统一、可操作的数字现实,以高效驱动决策与行动。其技术实施和产品沉淀的过程诚然是高复杂性、高难度的,但这正体现了Palantir所代表的新硅谷“All in AI+”的战略决心。对于我们而言,必须深刻认识到:企业数字化能力建设既不是高精尖技术的简单堆砌,也不是局部场景的数字化改良,而是一场企业级的“数字孪生”——关乎战略、组织与业务全域的体系能力的重塑。

SZSDQJC的博客 1685

C语言里struct和union的区别

struct和union是C语言的两种数据结构,这两种都是常用的复合结构。 区别: (1) 联合体:所有成员共用一块地址空间,也就是说联合体只放了一个被选中的成员; 结构体:所有的成员的内存占用是累加的,其所有成员都存在,不同成员会放在不同地址; 在计算一个结构体变量的总长度时,其内存空间大小等于所有成员长度之和(需考虑字节对齐);而在联合体中,所有成员不能同时占用内存空间,...

qq_37200329的博客 3418

避坑指南:STM32CubeMX安装后,你的第一个工程为什么中文全是乱码?

本文详细解析了STM32CubeMX安装后中文乱码问题的根源及解决方案。从诊断乱码现象到分析编码冲突背景,提供了新项目UTF-8化、旧项目GBK兼容及版本降级等多种实用方案,帮助开发者彻底解决这一常见问题。

weixin_30699955的博客 474

struct和union的区别

常见指令:

yukunjake的博客 3414

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4171

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 294

union和struct的区别

 首先看看union,在c++中,union可能没有多大用处,在c语言中,可能我们要借助其完成很多巧妙的设计,下面是其一个完整的定义:        union UTest        {             double dlOne;             char   chOne;             byte   bArray[4];        };

Humwen 2199

从零构建企业级多智能体系统:LangGraph 全流程实战 + 部署指南(含代码与架构图)

> 在大模型应用爆发的今天,如何构建一个可协作、可调试、可部署的多智能体系统?LangGraph 正在成为工程师的新宠。本文从原理剖析、流程建模、代码实战到前后端部署,手把手带你用 LangGraph 构建一个企业级 AI 助理系统,整合财务分析、法务审阅、报告生成与图表可视化等 Agent 模块,全面打通从用户输入到报告输出的全链路闭环。适合有工程思维的 AI 架构师、Agent 研发人员、以及大模型项目实践者。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3449

union 和 struct 的区别与联系

union ( 共用体):构造数据类型,也叫联合体   用途:使几个不同类型的变量共占一段内存(相互覆盖)  struct ( 结构体 ):是一种构造类型  用途: 把不同的数据组合成一个整体——自定义数据类型 主要区别: 1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员; 而struct的所有成员都存在。在s

maopig的专栏 2705

HotSpot G1 GC 的分区记账、SATB 并发标记与停顿目标调优解析

线上GC毛刺该调停顿目标、加大新生代还是换收集器?本文从HotSpot G1的设计出发,梳理分区与巨型对象、卡表与记忆集、写屏障与细化线程、停顿预测、SATB并发标记、自适应IHOP、混合回收规则及Full GC兜底,并注明JDK8至JDK27的版本差异。文中在JDK8与JDK17上实测:停顿目标从200ms降到20ms,伊甸区缩小四成、P99下降但仍超目标;巨型对象会反复触发又撤销并发标记;JDK17并行Full GC平均停顿约为JDK8的三成。最后给出日志解读、参数清单、调优流程与选型。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

音视频OSD——使用freetype将矢量字库的信息叠加至YUV

目录freetypes使用步骤1)包含头文件:2) 初始化库:3)加载face对象:4)设置字体大小5)设置字体位置,以及旋转度数:6)加载字形图像准备矢量字库代码.c.h效果叠加至YUV freetypes FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件 下载freetypes tar -xjf freetype-2.4.10.tar.bz2 cd freetype-2.4.10/ ./configure

路人coder 2364

union和struct的一些区别小结

union和struct的一些区别小结 1. union union中的所有成员共同占用一段内存,union的长度可以用sizeof运算符来求,union的长度要求必须: 1.至少要容纳最大成员类型变量的大小 2.必须是所有成员变量类型大小的整数倍 typedef union MyUnion//变量共同占用一段内存 { long i; int x; char a[17]; }TestUnion; int main() { TestUnion date; cout<<sizeof(da

qq_40877617的博客 319

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 71

C++中struct和union的区别

(1) 二者都是由不同的数据类型成员组成(否则也不需要定义这俩),但在任何同一时刻, 结构体存放所有的成员变量, 而共用体只存放一个被选中的成员。 (2)对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。比如: ...

享受当下 663

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

C++ 中 struct 和 union 的区别及使用

内存分配方式:存储特性:访问方式:初始化: 2. 类型转换技巧 3. 协议解析优化 4. 变体记录实现 注意事项 安全性:访问非当前活跃的成员是未定义行为,可能导致程序崩溃或数据错误 C++17改进:引入了作为更安全的替代方案 构造函数限制:union不能包含有非平凡构造函数的成员(C++11后放宽了部分限制) 用途:union最适合用于需要节省内存且明确知道当前存储类型的场景 在C++中,union的这些特性使其特别适合底层编程、协议解析、硬件寄存器映射等需要精确控制内存布局的场景。

weixin_45422672的博客 322

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

struct class union的区别

1

ycwasdfasdf的博客 1797

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

class 、struct和union的区别:

struct、union、class的区别

qq_38669789的博客 318

一文梳理struct、union、class区别

struct和class区别 关于函数:在C语言中,定义是面向过程的,所以,数据和操作都是分开的,C语言中的struct不能写函数,而C++中则可以 关于继承:继承只能是在C++中,struct 默认的是public,而class 默认的是private,在c++ 的class中,数据是具有隐私的,默认情况下,不能让其他人进行访问的。构造函数必须是public的。 struct和union区别...

乌云踏雪 793

struct、union、const 和 #define 区别

1. struct、union struct可以存储不同类型数据,可以同时使用,union也可以存储不同类型的数据,但是只能同时存储其中的一种,也就是说当存储int类型的变量时,其他数据类型丢失,存储double时,int之类的数据也会丢失。 在一个联合体内可以定义多种不同的数据类型。union中的各个成员共用一块内存。 共用内存的大小是和union中占空间最大的元素所占用的空间一样大,即这些数据共享同一段内存。 通过这种方法,可以达到节省空间的目的。 与struct相同,union的默认访问权限也是公有的

欢迎来到小木虫1314的博客 565

C语言中struct与union的区别

C语言中struct与union的区别

勇敢的心的网络笔记 8795
上一篇: Malloc与new的区别
下一篇: 数据库事务的四个基本性质(ACID)
Micro_Ryan
博客等级 码龄12年 27粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值