zoukankan      html  css  js  c++  java
  • 枚举类型与联合类型

    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;
    }
  • 相关阅读:
    Android兼容性测试CTS
    Tkinter
    初探socket
    性能监控2
    HTTP
    python实现接口自动化1
    pip安装超时问题
    一行 Python
    Python 面向对象进阶
    Python 面向对象编程基础
  • 原文地址:https://www.cnblogs.com/miner007/p/4149441.html
Copyright © 2011-2022 走看看