枚举类型与联合类型

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;
}
posted @ 2014-12-07 15:13  miner007  阅读(532)  评论(0编辑  收藏  举报