联合体与结构体是很容易混淆的概念。粗略一看,两者无论声明、定义还是定义对象的方式都很相似。然而这两个东西的概念和作用实际千差万别。 首先,联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而结构体各个成员各自拥有内存,各自使用互不干涉。所以,某种意义上来说,联合体比结构体节约内存。 举个例子: typedef struct { int i; int j;//(4+4) }A; typedef union { int i; double j;//(最大的就行) }U; sizeof(A)的值是8,sizeof(U)的值也是8(不是12)。 为什么sizeof(U)不是12呢?因为union中各成员共用内存,i和j的内存是同一块。而且整体内存大小以最大内存的成员的划分。即U的内存大小是double的大小,为8了。sizeof(A)大小为8,因为struct中i和j各自得到了一块内存,每人4个字节,加起来就是8了。 了解了联合体共用内存的概念,也就是明白了为何每次只能对其一个成员赋值了,因为如果对另一个赋值,会覆盖了上一个成员的值。
struct data { int i; char a; }b; int cc = sizeof(b);//为8,具体详见另一篇<内存对齐> cout << cc << endl;
struct data {char a;
int i;
}b; int cc = sizeof(b);//也为8,具体详见另一篇<内存对齐> cout << cc << endl;