打印
[开发工具]

空间利用:减少变量占用空间的union的使用

[复制链接]
449|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AdaMaYun|  楼主 | 2024-5-24 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在大多数编程环境中,union 通常用于空间优化。由于 union 的所有成员共享同一块内存空间,因此可以通过使用不同的数据类型来优化内存使用。以下是一个例子:

union Data {
    int i;
    short s[2];
    char c[4];
};
union Data data;

data.i = 12345;
printf("The short values are: %hd, %hd\n", data.s[0], data.s[1]);
printf("The char values are: %d, %d, %d, %d\n", data.c[0], data.c[1], data.c[2], data.c[3]);

在这个例子中,我们使用一个 union 来存储一个 int 值,在另外一个时间段,我们也可以使用这个 union 的其他成员(short 和 char 数组)来进行数据存取。
需要注意的是,虽然这种方法可以节省内存,但是它可能会导致数据不一致。例如,如果先使用 char 数组来读取数据,然后再使用 int 成员来读取数据,那么 int 成员将不会包含正确的值,因为它的数据已经通过 char 数组被修改了。因此,在使用 union 时,需要确保对数据的访问顺序是正确的。
这里我们举一个 CANopen的例子。
在Canopen 中,我们有一种PDO的通信形式,他就相当于预定义好了一条CAN 帧中 8 个自己的数据意义。我们可以简单的理解为,不同的 CANID,已经定义好了数据的具体意义,比如ID:1 和ID:2 的8 个字节分别表示成4 个速度变量和四个温度变量。
分析:在上面的背景当中,我们得知发送的消息的时候并不是同时要发送速度,温度的,而是每个帧分开来的发送的,并不是同时需要,那这个时候,我们就可以采用 union 的特性来构造一个数据结构,这样做的好处是能够缩减变量占用的内存。

struct buffer
{
    short id;   /*CAN——ID*/
    union
    {
        struct
        {
            short speed1;
            short speed2;
            short speed3;
            short speed4;
        } speed;

        struct
        {
            short temp1;
            short temp2;
            short temp3;
            short temp4;
        } temp;
    }Info;

}my_buff;

采用上述的结构的话,我们可以计算一下,结构体占用的存储空间是 10个字节,如果我们分别为温度和速度的解析来定义缓存变量,那么占用的内存空间将几乎增大一倍。
这里有了 id的加入,我们可以在接收端对数据进行解析了。
通过上述的这个例子可以了解,如果不使用 union 的话,在进行数据传输的时候,直接将由 struct 构造的数据形成数据帧发送过去,发送的数据包要比使用 union 构造的数据大不少,使用 union 构造数据,既能够帮助我们节省了存储空间,还节省了通信时的带宽。

使用特权

评论回复
沙发
OKAKAKO| | 2024-6-24 21:41 | 只看该作者
union的使用可减少变量占用空间,大大提升空间利用率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

240

主题

1800

帖子

3

粉丝