union联合体

 union联合体是一个很有用工具。

先看union联合体的描述:

在The C Programming Language里面讲述union内存分配的原话是

1)联合体就是一个结构

2)联合体的所有成员相对于基地址的偏移量为0

3)此结构空间要大到总够容纳最“宽”的成员

4)并且,其对其方式要适合于联合体中所有类型的成员

 

可以看出,联合体简单理解是多个不同类型共享一份地址空间的结构。

它可以容纳多个类型在一个空间里面。

实际上,对所有内存来说,就是一块地址空间。编译器可以解释成多种类型。如把一个字节解释成char,

把2个字节的空间解释成short ,把4个字节的空间解释成int ...

单是对内存一说,都是一维的空间,本没有类型的。

但是类型可以由编译器记忆,解释成多种类型。

而联合体也可以使用户从不同的类型来解释同一块内存。

举个例子:

编个程序判断你的系统是大端还是小端

#include <stdio.h>
#include <stdlib.h>
typedef union myUnion{
   int d;
   char s[4];
}myUnion;

int main(){
        myUnion u;
        u.d=0x1234;
        if(u.s[1] == 0x12){
                printf("da duan\n");
        }else if(u.s[1] == 0x34){
                printf("da duan\n");
        }else{
                printf("unknow duan\n");
        }
        return 0;
}

 

上面就是利用union,从char 的分析一个int内存的情况。

这个int 为16进制:0x1234

小端地址存放规则是:4321...的顺序

大端地址存放的规则是:1234...的顺序。

小端法则:从开始地址的前8位(一个字符长度)43

而大端的法则:开始地址的前8位是12

 

unoin联合体还有一个很好用的地方,在某些时刻可以用来节省内存空间。一物二用。

 

如做一个自由链表,让一个union指定一个内存地址数据,存入内容,当这块内存空闲不用的时候,可以作为一个链接的指针。

这个就可以节省掉next 指针的开销。大量数据,这部分节省开销是十分可观的。

在stl源码分析里面,就有讲stl 的alloc 分配器是如何利用union来建一条自由链表,进行内存分配。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值