跳转至

联合体和位域

位域

优化内存,节省内存空间

//0000 0001
struct LGCar2 {
    BOOL front: 1;//占1个位置 不是字节
    BOOL back : 2;//占2个位置
    BOOL left : 6;//占6个位置
    BOOL right: 1;//占1个位置
};
struct LGStruct1 {
    char a;//1字节
    char b;
    char c;
    char d;
}struct1;//4字节

struct LGStruct2 {
    char a : 1;//位域 :1 用1个域,占1个位
    char b : 1;
    char c : 1;
    char d : 1;
}struct2;//1字节

struct LGStruct3 {
    // a: 位域名  32:位域长度
    int a : 32;
    char b : 2;
    char c : 7;
    char d : 2;
}struct3;

struct LGTeacher1 {
    char *name;
    int age;
    double height;
}t1;

联合体union

共享内存,共用一块内存空间。

划一块足够大的内存空间,整块内存空间怎么使用,操作系统不会管理,程序员自己管理。

结构体里面的成员变量是共存,联合体里面的成员变量是互斥。

作用:节省内存空间。

用处:成员变量只能存在一个的时候。

//8字节
///1. 联合体必须能够容纳最大的成员变量
///2. 通过1计算出来的大小必须是其最大成员变量(基本数据类型)的整数倍
union LGTeacher2 {
    char *name;//指针 8字节
    int age;
    int height;
}t2;

union LGTeacher3 {
    char a[7]; //7
    int b; // 4
}t3; // 8

C++和C都有联合。C++的联合做了增强。

使用union 里面成员的公用存储空间,优点节省空间。

一个union里有多个成员,多个成员共用存储空间。使用union节省空间。

union U
{
private:
    int i;  //成员变量
    float f;
public:
    U(int a);   //构造函数
    U(float b);
    ~U();       //析构函数
    int read_int(); //成员函数
    float read_float();
};
U::U(int a) {i = a;}
U::U(float b) {f = b;}
U::~U() {cout << "U::~U()" << endl;}
int U::read_int() {return i;}
float U::read_float() {return f;}
void test()
{
    U X(12), Y(1.9f);
    cout << X.read_int() << endl;
    cout << Y.read_float() << endl;
}

Union 不安全,如果写成了cout << X.read_float() << endl;无法检查出来,结果是不对的。有可能错误的使用。

  • 联合(union)
  • 构造函数
  • 析构函数
  • 成员函数
  • 访问控制
  • 使用类封装联合

union类型不安全。要想使用安全,使用C++的类进行封装union。

class SuperVar
{
    enum//匿名枚举
    {
        character,
        integer,
        floating_point
    } varType;//varType是SuperVar的一个枚举类型的成员变量  (varType会用在print函数里,保证类型安全的)
    union//匿名的union 使用的时候可以直接使用
    {//c i f 共用存储空间
        char c;
        int i;
        float f;
    };
public:
    SuperVar(char ch);
    SuperVar(int ii);
    SuperVar(float ff);
    void print();
};

源文件

//三个构造函数
SuperVar::SuperVar(char ch)
{
    c = ch;
    varType = character;
}
SuperVar::SuperVar(int ii)
{
    i = ii;
    varType = integer;
}
SuperVar::SuperVar(float ff)
{
    f = ff;
    varType = floating_point;
}

还有一个print函数

print会自动检查保存响应的类型 并输出,所以不会出错,类型安全的。

void SuperVar::print()
{
    //首先检查类型,在构造函数里已经把类型保存好了
    switch (varType) {
            //根据不同的类型进行输出
        case SuperVar::character:
            cout << "character:" << c << endl;
            break;
        case SuperVar::integer:
            cout << "integer:" << i << endl;
            break;
        case SuperVar::floating_point:
            cout << "float:" << f << endl;
            break;
        default:
            break;
    }
}

最大优点:节省存储空间,几个成员共用存储空间。

因为现在电脑内存大了,所以用union体现不出来优势。

所以用class struct多些 成员存储空间是分开的,如果是union是共用的,但是现在用class struct的多。

只有在大型的数据结构中可能用到union,因为数据多,每一个节省一点点,积少成多。可以节省一点空间。