枚举类型与联合类型
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 = " << (void *)p1->client_data << endl; //cout<<p1->client_data<<endl; //client_data只是为了简化本段内存的定义的,只是方便一些, //可以使用(void *)p1表示本段内存,但是每次要转换,可能不方便吧, //实际中可能也用不到 return 0; }