版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingfengleerge/article/details/84031966
union与struct
一:特殊类union(联合体)
- 联合体(union)是一种特殊的类类型。
- 联合体可以有成员函数(包括构造函数和析构函数),但是不能有析构函数。
- 联合体无基类并且也不能作为基类。
- 联合体无静态数据变量。
- 联合体无特殊说明默认访问权限为public。
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用(共享)同一段内存时,使用联合体将是明智的选择。(这些数据共享同一段内存,以达到节省空间的目的)
union变量所占用的内存长度等于最长的成员的内存长度。
二:union内存分配
#include "stdafx.h"
#include <iostream>
#include <string>
union TestData {
struct TempStruct {
int x;
int y;
int z;
}ts;
int k;
};
int main()
{
TestData td;
td.ts.x = 4;
td.ts.y = 5;
td.ts.z = 6;
td.k = 0;
std::cout << td.ts.x << std::endl; //输出0
std::cout << td.ts.y << std::endl; //输出5
std::cout << td.ts.z << std::endl; //输出6
std::cout << td.k << std::endl; //输出0
std::cout << sizeof(td) << std::endl; //输出12
return 0;
}
解释:union类型是共享内存的,以size最大的结构作为自己的大小。每个数据成员在内存中的地址其实是相同的。那么联合体td的所占内存大小就是结构体ts所占的大小(12个字节),结构体ts内存排列为其内部声明的成员变量x,y,z从低到高的顺序排列。然后赋值时,x的位置放置4,y的位置放置5,z的位置放置6,再之后对k赋值,由于union共享内存,所以从union的首地址开始放置,而首地址开始的位置其实是x的位置,这样原来内存中的x的位置就被k所赋的值代替了,变为了0。之后打印出的结果就将是程序注释所呈现的结果了。
三:union与struct的区别
结构体(struct)中,所有数据成员时存储在相邻的内存中。一个struct对象的大小为所有数据成员的大小总和。(注意内存对齐)
struct特性如下:
- 可使用构造函数来初始化变量
- 拥有析构函数
- 成员访问权限默认为public
struct不同成员的赋值是不会相互影响的。