共用体union


目录


????- 概述

????????- 基本语法

????????- 匿名共用体

????- 改进

??

概述

  1. 结构体struct可以同时存储int、long、double等不同类型,

    而共用体union只能存储int、long、double等不同类型中的一个。

  2. 共用体union比struct节省内存,常用于配置低的硬件,如控制烤箱、MP3播放器或火星漫步者等嵌入式編程。

    基本语法


union one4all

{

????int int_val;

????long long_val;

????double double_val;

};

共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员。

所以,共用体的长度为最大成员长度。

?
?

匿名共用体


struct widget

{

????char brand[20];

????int type;

?
?

????union

????{

????????long id_num;

????????char id_char[20];

????};

?
?

};

由于共用体是匿名的,因此id_num和id_char被视为prize的两个成员,它们的地址相同,所以不需要中间标识符。我们只需要负责确定当前哪个成员是活动的。

?
?

改进

共用体union中只能储存静态数据类型(基本数据类型或者没有构造函数、析构函数的类/结构体)。

可以使用不定参数的模板类写一个Union,来改进union的不足。


//二元智能共用体:union的升级版

//使用指针指向动态类型,频繁地申请空间会使得效率变低。

//此外,若频繁地覆盖Union,动态类型的构造函数和析构函数也会拖低效率。

template<typename first, typename second>

class Union

{

public:

????first* _first;

????second* _second;

public:

????Union() :_first(nullptr), _second(nullptr) {}

????Union(first*& _first) :_first(_first), _second(nullptr) {}

????Union(second*& _second) :_first(nullptr), _second(_second) {}

????~Union();

?
?

????void set(const first& _first);

????void set(const second& _second);

?
?

????bool have(const first&);

????bool have(const second&);

?
?

????first& operator=(const first& _first);

????second& operator=(const second& _second);

?
?

????template<typename __first, typename __second>

????friend std::ostream& operator<<(std::ostream& os, const Union<__first, __second>& _union);

?
?

????template<typename __first, typename __second>

????friend String& operator<<(String& str, const Union<__first, __second>& _union);

};

?
?

原文地址:https://www.cnblogs.com/audacious/p/12236939.html

时间: 2024-08-03 16:32:22

共用体union的相关文章

共用体union详解

一共用体的概念 当需要把不同类型的变量存放到同一段内存单元或对同一段内存单元的数据按不同类型处理则 需要使用共用体数据结构 例把一个整型变量一个字符型变量一个实型变量放在同一个地址开始的内存单元中 共用体的定义形式 union 共用体名 成员列表 变量列表 注意区分 共用体各成员占相同的起始地址所占内存长度等于最长的成员所占内存 结构体各成员占不同的地址所占内存长度等于全部成员所占内存之和 二共用体变量的引用 只能引用共用体变量的成员如 union data a; a.i; a.ch; a.f;

(C语言)共用体union的使用方法举例

曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用红色部分标记的地方是后来加入上去的,谢谢yrqing718的提醒!] struct  Matrix { union { struct { float  _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float  f[3][3]; }

共用体(union)

在C语言中,当不同数据类型的数据共同占有使用一块内存空间时,这个数据构造类型叫做共用体,也叫联合体.共用体用的地方比较少,使用形式与结构体类似,但是内存使用方式不同. 1--- 定义 union 共用体类型名 { 成员表列: }变量名1:union 共用体类型名 变量名2: 2--- 成员共用同一个存储区域,共用体类型变量是以最后一次

C语言共用体union

union共用体说明: 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍. 比如union中有{int x; double x1; char name[10];}这个共用体的长度为10字节,因为name[10]是这个共用体中最大的一个变量 #include <stdio.h> struct A { int num; char name[20]; char job; union //共用体关键字union { int x; char zy[20]; }t

C结构体struct 和 共用体union的使用测试

#include <stdio.h> struct { char name[10]; char sex; char job; int num; union{ //联合只能共用同一个内存 int class; char position[10]; }category; }PE[2]; int main(){ int i; for(i=0;i<2;i++){ printf("请输入:号码 姓名 性别 职业\n"); scanf("%d %s %c %c"

[C/C++基础] 3.结构体、共用体、枚举

概述: 结构体和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,其次相同结构的结构体变脸是可以相互赋值的. 共用体(联合体)和结构体都是由多个不同的数据类型成员组成,但在任何同一时刻,共用体值存放了一个被选中的成员.而结构体的所有成员都存在. C++的枚举(enum)工具提供了另外一种可以替代const来创建符号常量的方式,枚举表是枚举常量的集合. 3.1 结构体struct 结构体类型变量的定义一般形式为: struct 结构体类型名{ 类型1 成员名1; 类型2 成员名2;

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

C语言 共用体

//共用体 union #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> // union 共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖) //共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存 union data{ char c; int a[10]; }udat1; union stu{

C++共用体的介绍

有时需要使几种不同类型的变量存放到同一段内存单元中.例如,可把一个整型变量.一个字符型变量.一个双精度型变量放在同一个地址开始的内存单元中(见图7.12). 图7.12 以上3个变量在内存中占的字节数不同,但都从同一地址开始存放.也就是使用覆盖技术,几个变量互相覆盖.这种使几个不同的变量共占同一段内存的结构,称为共用体(union )类型的结构(有些书译为联合). 声明共用体类型的一般形式为: union 共用体类型名{成员表列}; 定义共用体变量的一般形式为: 共用体类型名 共用体变量名; 当