union介绍,union与struct
转自:https://www.cnblogs.com/jeakeven/p/5113508.html
union介绍
共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。
union与struct比较
先看一个关于struct的例子:
struct student
{char mark;long num;float score;
};
其struct的内存结构如下,sizeof(struct student)的值为12bytes。
下面是关于union的例子:
union test
{char mark;long num;float score;
};
sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。其union类型的结构如下:
因union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
不能如下使用:
union test a;
printf("%d", a); //错误
由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。
printf("%d", a.mark); //正确
测试大小端
union的一个用法就是可以用来测试CPU是大端模式还是小端模式:
#include <iostream>
using namespace std;void checkCPU()
{union MyUnion{int a;char c;}test;test.a = 1;if (test.c == 1)cout << "little endian" <<endl;else cout << "big endian" <<endl;
}int main()
{checkCPU();return 0;
}
举例,代码如下:
#include <iostream>
using namespace std;union test
{char mark;long num;float score;
}a;int main()
{// cout<<a<<endl; // wronga.mark = 'b';cout<<a.mark<<endl; // 输出'b'cout<<a.num<<endl; // 98 字符'b'的ACSII值cout<<a.score<<endl; // 输出错误值a.num = 10;cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正cout<<a.num<<endl; // 输出10cout<<a.score<<endl; // 输出错误值a.score = 10.0;cout<<a.mark<<endl; // 输出空cout<<a.num<<endl; // 输出错误值cout<<a.score<<endl; // 输出10return 0;
}
C++中union
上面总结的union使用法则,在C++中依然适用。如果加入对象呢?
#include <iostream>
using namespace std;class CA
{int m_a;
};union Test
{CA a;double d;
};int main()
{return 0;
}
上面代码运行没有问题。
如果在类CA中添加了构造函数,或者添加析构函数,就会发现程序会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
union介绍,union与struct相关推荐
- c++ -- union介绍
union介绍 共用体,也叫联合体,在一个"联合"内可以定义多种不同的数据类型, 一个被说明为该"联合"类型的变量中,允许装入该"联合"所定 ...
- C++中的union介绍
union介绍 共用体,也叫联合体,在一个"联合"内可以定义多种不同的数据类型, 一个被说明为该"联合"类型的变量中,允许装入该"联合"所定 ...
- mysql联合union查询_Mysql联合查询UNION和UNION ALL的使用介绍
数据库 Mysql联合查询UNION和UNION ALL的使用介绍 字号+ 作者:小虾米 2016-12-05 12:47 Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意 ...
- mysql union 作用_Mysql联合查询UNION和UNION ALL的使用介绍
Mysql联合查询UNION和UNION ALL的使用介绍 一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNIO ...
- 悟空分词与mysql结合_Mysql联合查询UNION和UNION ALL的使用介绍
一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须 ...
- mysql 多列union_Mysql联合查询UNION和UNION ALL的使用介绍
一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须 ...
- Mysql union联合查询_Mysql联合查询union和union all的使用介绍
一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥 ...
- 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- 图解SQL的inner join、left join、right join、full outer join、union、union all的区别
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...
最新文章
- Android开发者指南(22) —— Accessing Resources
- zabbix对一台主机监控的操作
- c#中反射技术在Unity中的运用
- AHOI2013 Round2 Day2 简要题解
- Spring Cloud Netflix Hystrix介绍和使用
- 小程序css之圆角边框
- c mysql主从复制_Mysql 主从复制
- 基于FlexRay总线的汽车冗余线控转向系统的可靠性(FEMA)分析
- 测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?
- 【Python】实现B站MP4格式音频与视频合并,ffmpeg一个命令即可
- <数字图像处理>整理--冈萨雷斯版-华中科技大学powerpoint
- projective TSDF/TSDF/flipped TSDF三种截断符号距离函数比较的个人理解
- [CF_GYM102900L]Traveling in the Grid World
- 设计师常用的10种平面设计风格,你知道几个?
- teamviewer linux远程开机,Ubuntu远程管理(teamviewer)
- geoip mysql_GeoIP2 数据库更新地址
- webstorm常用插件集合(2020)
- 4.M2Eclipse插件的安装使用
- 远程服务器批量管理v1.6(附易语言源码)
- ext amp; prototype... info? - Ext JS