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来建一条自由链表,进行内存分配。