首页 > 代码库 > 枚举类型与联合类型

枚举类型与联合类型

enum类型:用途是整数和字符对应。

此处只是说明一下匿名枚举类型,enum {__ALIGN=8};此匿名枚举相当于静态常量,类似如下static const int __ALIGN=8;

 

union类型:共享内存的意思,有意思的是一般都是放成员数据,但还是也可以放函数,这里需要说明的是它可以被理解成一个特殊的结构体。(注意不是总是都能放函数)

在STL中有这么一个union体:union obj{union obj * free_list_link;char client_data[1];}共享内存大小是4B,而char client_data[1];占据了1个B,则选取大的是4B。这里有个设计亮点。

理解char client_data[1];是个数组,但是数组都是用一个指针指着头部的。则可以认为是有个指针client_data指着一个存储空间为1B的数组。则对于联合体而言则将其或扩充为4B,可以看到是client_data是指向了该联合体。则此处可以想到client_data竟然是本联合体的地址。此值有不是联合体内成员数,则实际上又不会和成员free_list_link共享,则相当于一个联合体含有2层逻辑意义,有本身地址还有指向下个的联合体的指针。

可以等价于struct obj{struct obj *free_list_link;};这里有个指向下个的指针,而本身的地址只能通过,例如obj * p=pt; 那么pt本省值就是P值。而不能像之前那样pt->client_data来获取。也可以通过&pt得到。但是注意:这里需要将其转为了(void *)指针才能被用,否则只是用了struct结构体部分的东西。而之前的设计中对于数组指针的内存是可被扩展的,被自动转换了。

 

#include <iostream>using namespace std;union obj{       union obj *free_list_link;      char client_data[1]; };     int main() {         //假设这两个是要分配出去的内存。    char mem[100] = { c};      char mem1[100] = { 0 };      //现在是每一块内存的开始均是一个union node结构        //----------------------------------        //| union obj | ....................      // ----------------------------------      union obj *p1 = (union obj *)mem;     char a=p1->client_data[0];    //cout <<*((p1->client_data)+1)<< endl;    //cout<<p1->free_list_link<<endl;    //cout<<p1->client_data<<endl;    //用一个变量表示这个结构          //p1->free_list_link 设置为下一个内存的起始段     p1->free_list_link = (union obj *)mem1 ;       //可以看到mem和client_data 两个指针值是一致的    cout <<"mem             = " << (void *)mem << endl;    //cout<<mem<<endl;    cout <<"p1->client_data = http://www.mamicode.com/" << (void *)p1->client_data << endl;       //cout<<p1->client_data<<endl;    //client_data只是为了简化本段内存的定义的,只是方便一些,         //可以使用(void *)p1表示本段内存,但是每次要转换,可能不方便吧,    //实际中可能也用不到    return 0;}

枚举类型与联合类型