C++__探讨union与struct

版权声明:本文为博主原创文章,未经博主允许不得转载。 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。之后打印出的结果就将是程序注释所呈现的结果了。

三:unionstruct的区别

结构体(struct)中,所有数据成员时存储在相邻的内存中。一个struct对象的大小为所有数据成员的大小总和。(注意内存对齐)

struct特性如下:

  • 可使用构造函数来初始化变量
  • 拥有析构函数
  • 成员访问权限默认为public

 

struct不同成员的赋值是不会相互影响的。

 

四:参考资料(感谢这些博主)

猜你喜欢

转载自blog.csdn.net/qingfengleerge/article/details/84031966