转自: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相关推荐

  1. c++ -- union介绍

    union介绍 共用体,也叫联合体,在一个"联合"内可以定义多种不同的数据类型, 一个被说明为该"联合"类型的变量中,允许装入该"联合"所定 ...

  2. C++中的union介绍

    union介绍 共用体,也叫联合体,在一个"联合"内可以定义多种不同的数据类型, 一个被说明为该"联合"类型的变量中,允许装入该"联合"所定 ...

  3. mysql联合union查询_Mysql联合查询UNION和UNION ALL的使用介绍

    数据库 Mysql联合查询UNION和UNION ALL的使用介绍 字号+ 作者:小虾米 2016-12-05 12:47 Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意 ...

  4. mysql union 作用_Mysql联合查询UNION和UNION ALL的使用介绍

    Mysql联合查询UNION和UNION ALL的使用介绍 一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNIO ...

  5. 悟空分词与mysql结合_Mysql联合查询UNION和UNION ALL的使用介绍

    一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须 ...

  6. mysql 多列union_Mysql联合查询UNION和UNION ALL的使用介绍

    一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行. UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须 ...

  7. Mysql union联合查询_Mysql联合查询union和union all的使用介绍

    一.UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥 ...

  8. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  9. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  10. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

最新文章

  1. Android开发者指南(22) —— Accessing Resources
  2. zabbix对一台主机监控的操作
  3. c#中反射技术在Unity中的运用
  4. AHOI2013 Round2 Day2 简要题解
  5. Spring Cloud Netflix Hystrix介绍和使用
  6. 小程序css之圆角边框
  7. c mysql主从复制_Mysql 主从复制
  8. 基于FlexRay总线的汽车冗余线控转向系统的可靠性(FEMA)分析
  9. 测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?
  10. 【Python】实现B站MP4格式音频与视频合并,ffmpeg一个命令即可
  11. <数字图像处理>整理--冈萨雷斯版-华中科技大学powerpoint
  12. projective TSDF/TSDF/flipped TSDF三种截断符号距离函数比较的个人理解
  13. [CF_GYM102900L]Traveling in the Grid World
  14. 设计师常用的10种平面设计风格,你知道几个?
  15. teamviewer linux远程开机,Ubuntu远程管理(teamviewer)
  16. geoip mysql_GeoIP2 数据库更新地址
  17. webstorm常用插件集合(2020)
  18. 4.M2Eclipse插件的安装使用
  19. 远程服务器批量管理v1.6(附易语言源码)
  20. ext amp; prototype... info? - Ext JS

热门文章

  1. 一个小时学会jQuery
  2. Linux 主要目录速查表
  3. informix 计算 日期之差
  4. python 详解re模块
  5. [No0000FF]鸡蛋煮熟了蛋黄为什么发黑?
  6. 【转】项目代码风格要求
  7. Oracle客户端配置
  8. 关于 html 中 table 表格 tr,td 的高度和宽度
  9. HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
  10. 第1章 神经网络的思想