union介绍

  共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。

union与struct比较

先看一个关于struct的例子:

  1. struct student
  2. {
  3. char mark;
  4. long num;
  5. float score;
  6. };

其struct的内存结构如下,sizeof(struct student)的值为12bytes。

下面是关于union的例子:

  1. union test
  2. {
  3. char mark;
  4. long num;
  5. float score;
  6. };

sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。其union类型的结构如下:

因union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。

不能如下使用:

  1. union test a;
  2. printf("%d", a); //错误

由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。

  1. printf("%d", a.mark); //正确

测试大小端

union的一个用法就是可以用来测试CPU是大端模式还是小端模式:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void checkCPU()
  5. {
  6. union MyUnion{
  7. int a;
  8. char c;
  9. }test;
  10. test.a = ;
  11. if (test.c == )
  12. cout << "little endian" <<endl;
  13. else cout << "big endian" <<endl;
  14. }
  15.  
  16. int main()
  17. {
  18. checkCPU();
  19. return ;
  20. }

举例,代码如下:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. union test
  5. {
  6. char mark;
  7. long num;
  8. float score;
  9. }a;
  10.  
  11. int main()
  12. {
  13. // cout<<a<<endl; // wrong
  14. a.mark = 'b';
  15. cout<<a.mark<<endl; // 输出'b'
  16. cout<<a.num<<endl; // 98 字符'b'的ACSII值
  17. cout<<a.score<<endl; // 输出错误值
  18.  
  19. a.num = ;
  20. cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正
  21. cout<<a.num<<endl; // 输出10
  22. cout<<a.score<<endl; // 输出错误值
  23.  
  24. a.score = 10.0;
  25. cout<<a.mark<<endl; // 输出空
  26. cout<<a.num<<endl; // 输出错误值
  27. cout<<a.score<<endl; // 输出10
  28.  
  29. return ;
  30. }

C++中union

上面总结的union使用法则,在C++中依然适用。如果加入对象呢?

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class CA
  5. {
  6. int m_a;
  7. };
  8.  
  9. union Test
  10. {
  11. CA a;
  12. double d;
  13. };
  14.  
  15. int main()
  16. {
  17. return ;
  18. }

上面代码运行没有问题。

  如果在类CA中添加了构造函数,或者添加析构函数,就会发现程序会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

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

c++ --> union介绍的更多相关文章

  1. SQL union介绍

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须 ...

  2. msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍

    1.ANY关键字 假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(.. ...

  3. 03-oracle中的高级查询

    1.连接查询 1.1 使用连接谓词指定的连接 介绍: 在连接谓词表示形式中,连接条件由比较运算符在WHERE子句中给出,将这种表示形式称为连接谓词表示形式,连接谓词又称为连接条件. 语法: [< ...

  4. 【转】Mysql联合查询union和union all的使用介绍

    Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...

  5. SQL 提示介绍 hash/merge/concat union

    查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...

  6. Mysql联合查询UNION和UNION ALL的使用介绍

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

  7. 防止sql注入和sqlmap介绍

    sql注入问题从WEB诞生到现在也一直没停过,各种大小公司都出现过sql注入问题,导致被拖库,然后存在社工库撞库等一系列影响. 防止sql注入个人理解最主要的就一点,那就是变量全部参数化,能根本的解决 ...

  8. Python之路Day12--mysql介绍及操作

    上节回顾: 1. RabbitMQ a. 平均分发 b. perfetch = 1 c. durable 队列持久化  deliver_mode = 2 消息持久化 d. 1对多广播  exchang ...

  9. Unix及类Unix系统文本编辑器的介绍

    概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...

随机推荐

  1. ffmpeg结构体以及函数介绍(一)

    本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmp ...

  2. IDirectDraw接口

    创建一个主DirectDraw对象,并使用QueryInterface()方法来得到最新的IDirectDraw7接口,或是直接用DirectDrawCreateEx()函数直接创建一个DirectD ...

  3. 个性化WinPE封装方法----制作过程需要了解的“命令”

    1.在现有的Windows7条件下,自动在E盘建立mywinpe文件夹,设置 Windows PE 构建环境,并保存到E:\mywinpe下 copype.cmd x86 E:\mywinpe 2.将 ...

  4. 书籍--嵌入式C语言

    1,C语言嵌入式编程修炼 [C/C++]C语言嵌入式编程修炼·背景篇·软件架构篇·内存操作篇

  5. GridView 多余字符显示省略号,并在Tooltip中显示完整信息

    效果 方法一:TemplateField 关键点 TemplateField的灵活性 CSS:overflow:hidden;text-overflow:ellipsis (溢出时隐藏;文本溢出时省略 ...

  6. haproxy反向代理配置示例

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)

    洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...

  8. 【BZOJ2754】喵星球上的点名(AC自动机)

    [BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...

  9. Luogu345: [POI2007]POW-The Flood

    题意 见luogu Sol 贪心 从小到大枚举高度,把小于等于这一高度的相邻格子用并查集合并 那么这个集合内的所有格子都一定可以由这个集合内的一个最低点抽完水 那么合并之后(一定要在合并之后) 判断这 ...

  10. Office 365 Connectors 的使用与自定义开发

    前言 我相信很多人都看过<三国演义>,里面有很多引人入胜的故事和栩栩如生的人物,对我而言,曹操手下的一员猛将典韦实在让我印象深刻.例如,书中有一段描写典韦的作战经历: 时西面又急,韦进当之 ...