union节省内存

2024-04-23 21:12
文章标签 内存 union 节省

本文主要是介绍union节省内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

联合体

  • 一、联合体的优点
  • 二、联合体定义
  • 三、联合体的使用
  • 四、python 联合体的使用

一、联合体的优点

由于联合体里的变量共同占有一个空间,可以利用联合体达到节省内存空间的目的。
需要注意:同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
结构体和联合体的区别参考博客:https://blog.csdn.net/sjtudou/article/details/81074916

二、联合体定义

比如当前有一个记录TMR历史事件信息的结构体 ,包括产生中断时的计数器的时刻tmrtime、计数器的值TMRCNT、 各个中断标志状况。

typedef struct {Time_TypeDef tmrtime;uintl6_t tmrcnt;uintl6_t tmrcap;uint8_t acif; uint8_t cmpif;uint8_t capif; uint8_t prdif;
}TMR_SINGLE_EVENT_T:

其中用于记录时间tmrtime的结构Time_TypeDef 有两种方式:
一种使用秒、毫秒、微秒的Sys_Time_Data_t 结构体形式,另一种直接使用 uint64_t 的大数统计tick值。
tick值具体含义为表示滴答定时器走的tick值的个数。
使用tick值是因为单片机开启了滴答定时器,使用滴答定时器记录时间,滴答定时器每走一次为1个tick,每个tick的时间取决于系统时钟的频率。
每次进入滴答定时器中断时间不能过小,不然频繁进入该中断函数,程序无法正常执行了。

typedef union{Sys_Time_Data_t  ustime;uint64_t ticktime;
}Time_TypeDef;typedef struct{uint16_t us;uint16_t ms;uint32_t s;
}Sys_Time_Data_t;

这两中结构都是时间的两种统计形式,并且同时只会使用一种时间的统计方式,不会相互干扰。可以写在联合体里。
如果时间这里不使用联合体,直接写两个时间结构体,会多占用uint64_t 8个字节空间。这还只是单个TMR历史事件结构体多的空间,如果历史事件结构体数组,会多占用8字节 * 数组长度空间!对于单片机而言占的就过大了。

三、联合体的使用

根据具体情况选择选择时间统计方式

TMR_SINGLE_EVENT_T event;
if(1){event.tmrtime.ustime = sys_time_data;   //sys_time_data 为随时间增加而增加的变量
}else{event.tmrtime.ticktime = TickVal* 0xFFFFFFFF + SysTick->Val // TickVal 为进入滴答定时器中断的次数,SysTick->Val 为滴答定时器该时刻的tick值
}

四、python 联合体的使用

python中使用需要包含ctypes库,联合体的定义和使用如下:

import ctypes
## 联合体定义
class Time_TypeDef(ctypes.Union):_fields_= [('ustine', SysTimeData),('ticktine', c_uint64),
]
class HT_TIMER_SINGLE EVENT_TypeDef(LittleEndianStructure):_раck_= 1fields_= [('tmrtime', Time_TypeDef),('tarcnt', c_uint16),('tnrcaр', c_uint16),('acif', c_uint8),('cmpif', c_uint8),('capif', c_uint8),('prdif', c_uint8)]
## 联合体使用
event =  HT_TIMER_SINGLE EVENT_TypeDef()
if True:event.tmrtime.ustime = sys_time_data
else:event.tmrtime.ticktime = TickVal* 0xFFFFFFFF + SysTick->Val 

这篇关于union节省内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929901

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe