C/C++ union

一、概念

  中文称为共用体或联合体。主要用于共享内存,在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。

  在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

二、举例

(1)用union判断大小端

  union var

  {

    char c[4];

    int i;
  };


  int main()

  {
    var data;
    data.c[0] = 0x04;
    data.c[1] = 0x03;
    data.c[2] = 0x02;
    data.c[3] = 0x11;

    //数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
    //而把四个字节作为一个整体,应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
    printf("%x\n",data.i);
  }

  结果:
        11020304       //证明是小端(little-endian)

(2)含有struct的union

  void main()
  {
    union number
    {
      int i;

      struct

      {
        char first;
        char second;
      }half;

    }num;
    num.i=0x4241; /*联合成员赋值*/
    printf("%c%c/n", num.half.first, num.half.second);
    num.half.first='a'; /*联合中结构成员赋值*/
    num.half.second='b';
    printf("%x/n", num.i);
  }
输出结果为: 
  AB 
  6261

三、带对象的union

  由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

posted on 2017-08-22 14:26  chakyu  阅读(193)  评论(1编辑  收藏  举报

导航