滴水三期:day29.1-联合体

本文介绍了C语言中的联合体(union)的定义和使用方式,包括两种定义形式的区别。联合体的主要作用在于节省内存空间,通过共享内存空间来存储不同类型的数据。例如,当需要存储一个int类型和char类型的数据时,使用结构体会造成空间浪费,而联合体则可以有效地解决这一问题。此外,文中通过身份证和学号的例子进一步解释了联合体在实际场景中的应用。联合体的特点是其成员共享内存,内存大小等于最大成员的大小。

一、联合体说明

1.联合体定义

  • 格式:

    union TestUnion{	
    	char x;
    	int y;
    	//...
    };
    
    union{
    	char x;
    	int y;
    	//...
    }TestUnion;
    
  • 这两种定义方式的区别:

    • 第一种TestUnion表示一种联合体的数据类型,使用如下

      TestUnion t;  //类型
      t.x = 0x1;
      t.y = 0x2;
      
    • 第二种TestUnion表示此联合体类型的变量,使用如下

      TestUnion.x = 0x1;  //直接就是变量
      TestUnion.y = 0x2;
      

    结构体也同样可以这么使用

2.为何要定义联合体

  • 比如现在有两个十六进制数我们要存储,一个是int类型的0x12345678,一个是char类型的0x78。一般需要定义两个局部变量:一个int型,一个char型,就需要占8字节空间(32位本机尺寸的概念);使用结构体存也同样会浪费空间(字节对齐的概念)。但是我们观察一下,如果使用一个4字节内存存储0x12345678,在栈中[ebp + 4]应该为78 56 34 12,此时[ebp + 4]中的低8位,刚好就是0x78,如果能用一个内存来存储两种类型的数据,且这两个数据关系就是我使用哪个完全取决于我取这个内存的几位(比如我想取char类型变量用,就相当于取这个内存的低8位,如果我想取int类型变量用,就取这个内存的32位用),那么这样做的好处就是节省了空间,而且想使用哪个取决于我们

  • 举例:

    • 假如现在每一个人有两个信息可以证明自己的身份,一个是身份证,一个是学号。身份证需要4字节存储,学号需要1字节存储,且学号取身份证号(十六进制)低1字节。但是对于这两个变量,我们只需要知道一个就可以确认身份或者登记时只登记一个即可。

      #include "stdafx.h"
      union TestUnion{
      	char studyID;
          int identityID;
      };
      int main(int argc,char* argv[]){
          TestUnion st1;  //学生1,既有身份编号,又有学号
          TestUnion st2;  //学生2,同上
          st1.identityID = 0x87654321;  //现在登记学生的身份编号就足以了
          st2.identityID = 0x12345678;
          //如果我现在想查看学生们的学号,不查看身份编号
          printf("%x\n%x",st1.studyID,st2.studyID);
          return 0;
      }
      

3.联合体特点

  • 联合体的成员是共享内存空间的
  • 联合体的内存空间大小是联合体成员中对内存空间大小要求最大的空间大小,即联合体中的宽度最大变量宽度
以下是处理文本数据并绘制CPU指标折线图的Python程序: ```python import re import matplotlib.pyplot as plt from datetime import datetime # 示例数据 data = """ Line 11: [2025-12-22 14:32:03] CPU: 12.4% usr 29.8% sys 0.0% nic 51.8% idle 0.7% io 0.0% irq 5.0% sirq Line 43: [2025-12-22 14:32:04] CPU: 11.6% usr 27.7% sys 0.0% nic 58.5% idle 0.0% io 0.0% irq 2.1% sirq Line 75: [2025-12-22 14:32:05] CPU: 30.3% usr 37.3% sys 0.0% nic 19.7% idle 0.5% io 0.0% irq 12.0% sirq Line 106: [2025-12-22 14:32:06] CPU: 38.9% usr 32.4% sys 0.0% nic 9.9% idle 0.9% io 0.0% irq 17.7% sirq Line 138: [2025-12-22 14:32:07] CPU: 36.3% usr 36.8% sys 0.0% nic 12.1% idle 0.5% io 0.0% irq 14.1% sirq Line 170: [2025-12-22 14:32:08] CPU: 17.0% usr 23.7% sys 0.0% nic 50.2% idle 0.2% io 0.0% irq 8.7% sirq Line 202: [2025-12-22 14:32:09] CPU: 16.4% usr 29.1% sys 0.0% nic 45.3% idle 3.0% io 0.0% irq 6.0% sirq """ # 解析数据 pattern = r'\[(.*?)\] CPU:(.*?)$' entries = [] for line in data.strip().split('\n'): match = re.search(pattern, line) if match: timestamp = datetime.strptime(match.group(1), '%Y-%m-%d %H:%M:%S') metrics = match.group(2).split() metrics_dict = {} for i in range(0, len(metrics), 2): if i+1 < len(metrics): value = float(metrics[i].replace('%', '')) name = metrics[i+1] metrics_dict[name] = value entries.append((timestamp, metrics_dict)) # 准备绘图数据 timestamps = [entry[0] for entry in entries] metrics_names = ['usr', 'sys', 'nic', 'idle', 'io', 'irq', 'sirq'] metric_values = {name: [] for name in metrics_names} for timestamp, metrics in entries: for name in metrics_names: metric_values[name].append(metrics.get(name, 0)) # 绘制折线图 plt.figure(figsize=(12, 6)) for name in metrics_names: plt.plot(timestamps, metric_values[name], label=name, marker='o') plt.title('CPU Usage Metrics Over Time') plt.xlabel('Time') plt.ylabel('Percentage (%)') plt.legend() plt.grid(True) plt.tight_layout() plt.show() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值