自定义类型联合体(下)

简介: 自定义类型联合体

对于un1,char c[5]其实相当于放了5个char类型的变量,每个变量只占一个字节,而int i是占的4个字节,因此最大对齐数的整数倍数应该是4,最后还得浪费3个字节变成8个字节才行

而un2, short c[7]中是相当于放了7个short类型的变量,每个变量是2个字节,而int i是4个字节,所以最大对齐数是4,因此最后需要浪费两个字节将14变成16才可以

使用联合体是可以节省空间的,举例:

比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。

每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

图书:书名、作者、页数

杯子:设计

衬衫:设计、可选颜色、可选尺寸

struct gift_list
{
  //公共属性
  int stock_number;//库存量
  double price; //定价
  int item_type;//商品类型
  //特殊属性
  char title[20];//书名
  char author[20];//作者
  int num_pages;//⻚数
  char design[30];//设计
  int colors;//颜⾊
  int sizes;//尺⼨
};

上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。

因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。

联合体的应用

联合体具体是什么时候用呢?

使用联合体时某些成员不会在同一时间使用

我们举个例子

比如:我们需要搞一个活动,需要上限一个礼品兑换单,礼品兑换单重有三种商品:图书 杯子 衬衫

图书的特殊类型:书名,作者,页数

杯子的特殊类型:设计

衬衫的特殊类型:设计,可选颜色,可选尺寸

三个商品共用的信息为库存量 价格 商品类型

struct gift_list
{
  int stock_number;//库存量
  double price; //定价
  int item_type;//商品类型
  union {
    struct
    {
      char title[20];//书名
      char author[20];//作者
      int num_pages;//⻚数
    }book;
    struct
    {
      char design[30];//设计
    }mug;
    struct
    {
      char design[30];//设计
      int colors;//颜⾊
      int sizes;//尺⼨
    }shirt;
  }item;
};

商品是图书,就不需要design、colors、sizes。

当我们需要用到书的信息时,我们只需要用item.book就可以查询,其他的也是类似的

所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存

联合的一个练习

写一个程序,判断当前机器是大端?还是小端?

int check_sys()
{
  union Un
  {
    char c;
    int i;
  }u;
  u.i = 1;
  return u.c;
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
    printf("小端\n");
  else
    printf("大端\n");
}

因为char c和int i是共用内存的,而且char c是占的第一个字节,所以我们只需要看c最后的值是多少就可以判断编译器是大端存储还是小端存储

相关文章
|
机器学习/深度学习 人工智能 算法
如何使用Scikit-learn在Python中构建一个机器学习分类器
如何使用Scikit-learn在Python中构建一个机器学习分类器
178 3
|
前端开发 JavaScript 数据库
mui中使用ajax实现登录功能
mui中使用ajax实现登录功能
246 0
|
6月前
|
Python
课时25:字符串复制
摘要:接下来学习字符串的剩余内容,文件名为07.复制字符串.py。在此之前做一个之前的小练习(简单但要认真写,尤其是第一次学习的情况下),创建一个变量来保存你的名字。 1. 练习 2.字符串的复制
|
人工智能 自然语言处理 搜索推荐
基于阿里云向量检索服务搭建AI智能问答机器人
基于阿里云向量检索服务搭建AI智能问答机器人
123706 38
|
Java 测试技术 Maven
单元测试添加运行参数的maven插件
单元测试添加运行参数的maven插件
126 0
egg.js 24.12sequelize模型-where操作符
egg.js 24.12sequelize模型-where操作符
132 1
egg.js 24.12sequelize模型-where操作符
|
存储 Java
探索Stream流的实际应用场景
在Java 8中,引入了Stream流这一强大的新特性,它不仅可以让我们更加优雅地处理集合数据,还可以提高代码的简洁性和性能。本文将深入探讨Stream流的实际应用场景,从而帮助读者更好地理解和应用这一功能。
811 0
|
网络协议 网络安全 Android开发
防火墙NAT策略(一)
人类对计算机网路的使用已经拓展到各个领域,而计算机网络的设计者在当时无法想象网络能有今天的规模。任何一个接入互联网的计算机、lpad、手机及安卓电视,要想在互联网中畅游,必须有一个合法的IP地址。而IP地址,曾经认为足以容纳全球的计算机,但是在今天看来,已经严重枯竭。IPv6的出现就是为了解决地址不足的问题。但在IPv6普及之前,需要有一个过渡技术——NAT。NAT的出现缓解了地址不够用的情况,它可以让同一局域网内60000多用户同时使用一个合法P地址访问互联网。NAT技术不是新技术,对于我们来说也并不陌生,文本重点介绍华为的NAT技术。
防火墙NAT策略(一)
|
算法 光互联 机器学习/深度学习
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.3.4 相干光模块的DSP 技术的发展
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.3.4 相干光模块的DSP 技术的发展