c++ --> union介绍
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 = ;
if (test.c == )
cout << "little endian" <<endl;
else cout << "big endian" <<endl;
} int main()
{
checkCPU();
return ;
}
举例,代码如下:
#include <iostream>
using namespace std; union test
{
char mark;
long num;
float score;
}a; int main()
{
// cout<<a<<endl; // wrong
a.mark = 'b';
cout<<a.mark<<endl; // 输出'b'
cout<<a.num<<endl; // 98 字符'b'的ACSII值
cout<<a.score<<endl; // 输出错误值 a.num = ;
cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正
cout<<a.num<<endl; // 输出10
cout<<a.score<<endl; // 输出错误值 a.score = 10.0;
cout<<a.mark<<endl; // 输出空
cout<<a.num<<endl; // 输出错误值
cout<<a.score<<endl; // 输出10 return ;
}
C++中union
上面总结的union使用法则,在C++中依然适用。如果加入对象呢?
#include <iostream>
using namespace std; class CA
{
int m_a;
}; union Test
{
CA a;
double d;
}; int main()
{
return ;
}
上面代码运行没有问题。
如果在类CA中添加了构造函数,或者添加析构函数,就会发现程序会出现错误。由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
参考:http://www.jellythink.com/archives/468
c++ --> union介绍的更多相关文章
- SQL union介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集 UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须 ...
- msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
1.ANY关键字 假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(.. ...
- 03-oracle中的高级查询
1.连接查询 1.1 使用连接谓词指定的连接 介绍: 在连接谓词表示形式中,连接条件由比较运算符在WHERE子句中给出,将这种表示形式称为连接谓词表示形式,连接谓词又称为连接条件. 语法: [< ...
- 【转】Mysql联合查询union和union all的使用介绍
Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...
- SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- Mysql联合查询UNION和UNION ALL的使用介绍
UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行.UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相 ...
- 防止sql注入和sqlmap介绍
sql注入问题从WEB诞生到现在也一直没停过,各种大小公司都出现过sql注入问题,导致被拖库,然后存在社工库撞库等一系列影响. 防止sql注入个人理解最主要的就一点,那就是变量全部参数化,能根本的解决 ...
- Python之路Day12--mysql介绍及操作
上节回顾: 1. RabbitMQ a. 平均分发 b. perfetch = 1 c. durable 队列持久化 deliver_mode = 2 消息持久化 d. 1对多广播 exchang ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...
随机推荐
- 提升R代码运算效率的11个实用方法——并行、效率
转载于36大数据,原文作者:Selva Prabhakaran 译者:fibears 众所周知,当我们利用R语言处理大型数据集时,for循环语句的运算效率非常低.有许多种方法可以提升你的代码运算效率 ...
- 使用DirectDraw直接显示YUV视频数据
最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...
- CSS注释
CSS注释 1./*注释内容*/ /*-moz-background-origin:border; -webkit-background-origin:border; -moz-background- ...
- MongoDB集群之分片
原文:点击打开链接 MongoDB分片 分片(sharding)是将数据拆分,将其分散在不同的机器上的过程.MongoDB支持自动分片 片键(shard key)设置分片时,需要从集合里面选一个键,用 ...
- Error Code: 1305. FUNCTION student.rand_string does not exist
1.错误描述 13:52:42 call new_procedure Error Code: 1305. FUNCTION student.rand_string does not exist 0.0 ...
- (二十)java小练习二
练习4:定义一个整数数组,编写程序求出一个数组的基数和偶数个数 package demo; /* * 定义一个整数数组,编写程序求出一个数组的基数和偶数个数 */ public class Tes ...
- HTML5可以省略全部标记的元素
HTML5可以省略全部标记的元素 1.body 2.colgroup 3.html 4.head 5.tbody
- TypeError: Error #1009: 无法访问空对象引用的属性或方法
1.错误描述 TypeError: Error #1009: 无法访问空对象引用的属性或方法. at FirstMap/search_clickHandler()[E:\Flash Builder\M ...
- android小程序之幸运菜谱
android小程序之幸运菜谱 前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷) 一开始得 ...
- I2C总线协议的软件模拟实现方法
I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...