码迷,mamicode.com
首页 > 其他好文 > 详细

共用体union

时间:2020-01-27 22:14:01      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:white   pad   operator   gre   val   span   硬件   最大的   函数   

目录

????- 概述

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

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

????- 改进

??

概述

  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);

};

? ?

共用体union

标签:white   pad   operator   gre   val   span   硬件   最大的   函数   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!