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带有对象。

参考:http://www.jellythink.com/archives/468

转载于:https://www.cnblogs.com/jeakeven/p/5113508.html

c++ -- union介绍相关推荐

  1. C++中的union介绍

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

  2. C++中的union(联合体,共用体,数据变量可以共享内存,以节省内存空间)

    union介绍 C++的union本质上也是个类,跟struct性质几乎一致但是有一个最大的区别,数据共享内存. 说到共享内存就要说下union的内存分配:union的大小是按照union里面的成员内 ...

  3. MySQL 基础———— UNION 联合查询

    引言 联合查询与连接查询不同,通过UNION 关键字,我们可以将多个查询语句一同执行并将结果集展示出来,不涉及到任何关联关系. UNION 的含义是"联合,并集,结合",在MySQ ...

  4. c语言20字节的内存的数据怎么读取_C++编程-内存对齐

    内存对齐可以大大提升内存访问速度,是一种用空间换时间的方法. 1.内存对齐的计算机原理 内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含 ...

  5. C语言基本变量语法输出和输入方法

    其他基本数据类型java有这里就不介绍了 ide:visual studio2013 操作系统:win10 64 bit 从这篇开始 我会记录下我每天学习jni的过程. ide下载地址:visual ...

  6. SQL注入-盲注-时间注入-报错注入-布尔盲注-DNSlog注入-宽字节注入-WAF绕过-SqlMap使用

    Sqli-labs的安装 1.安装WAMP http://www.wampserver.com/ WAMP是php + mysql + Apache环境集成工具 2.下载Sqli-labs https ...

  7. sql99的多表查询

    SQL99语法下的多表连接 1.引入 例题: 现在有三张表: 第一张表:t_emp(储存人物基本信息) ID NAME AGE DEPTID EMPNO 1 风清扬 90 1 100001 2 岳不群 ...

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

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

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

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

最新文章

  1. springboot 简单自定义starter - beetl
  2. android studio 顶部导航栏_5分钟学交互:手机交互组件归纳 导航篇
  3. 小甲鱼Python课程18课课后题
  4. android+布局倾斜,android – 如何在Eclipse图形布局视图中使斜...
  5. 计算机视觉---4---多视角几何学
  6. echart中拆线点的偏移_Real BIM | Rhino+Grasshopper在双曲异形玻璃幕墙中的应用
  7. 基于java SSM校园兼职平台系统设计和实现
  8. Windows开发时IsWindowVisible返回错误的处理方法
  9. docker搭建Redis的主从集群
  10. 两道关于回溯法,分支限界法的算法题
  11. Java经典设计模式-创建型模式-抽象工厂模式(Abstract Factory)
  12. 阿里云云计算 50 云监控的使用
  13. onenote 0xE000078D解决
  14. 小家电企业坐上“过山车”,是谁浇灭了年轻人的热情?
  15. [SSL_CHX][2021-08-20]幸运数字们
  16. 极简浏览器主页网址导航自定义网址壁纸云端同步简洁清爽
  17. 上海交通大学python实验七答案_20192310 实验八《数据结构与面向对象程序设计》实验报告...
  18. Python入门(二十三)- 文件操作1
  19. 金融风控机器学习第三十一天---拜师课堂 机器学习算法--决策树 随机森林
  20. 软考信息系统项目管理师质量管理高分论文赏析

热门文章

  1. jmeter(三)参数化
  2. python错误修复_如何修复python错误(对象不可调用)
  3. oracle 同义词_Oracle迁移到MySQL,必须要搞明白这几个问题
  4. vue 2个方法先后执行_浅析Vue的2个版本
  5. vnc连接linux颜色灰色,VNC 灰色的屏幕解决方法
  6. win10系统中环境变量path变成一行显示(配置环境)
  7. 在windows 实现执行 makefile
  8. NRF24L01+ 自动重发,自动应答BUG
  9. cookie放在请求头_Web安全:你必须知道的“Cookie安全”
  10. 一个亿的融资在一家芯片初创公司可以烧多久?