当前位置:C++技术网 > 资讯 > 数据类型:5 宏、常量、枚举、结构体和共用体对比分析之共用体

数据类型:5 宏、常量、枚举、结构体和共用体对比分析之共用体

更新时间:2015-06-23 17:07:20浏览次数:1+次

    第三篇  共用体
    共用体,这个东西以前学过,但是很少使用,就也忘了差不多了。但是后来在一个设计分析一个协议时,用到了这个东西,然后又仔细研究了一下。
    这些小玩意也都不难,理解起来也简单。只是有时候运用在复杂的环境时,比较容易模糊。所以是有必要专门来讨论一下。平常用的不多,但是有时候就特别有用,还是要掌握。而这个的应用,一般都是对内存要求高的场合,而一般的编程,根本就不在乎那点内存。
先说说共用体的含义。共用体关键字是union,其设计的目的就是为了节省内存。在共用体内部的几个成员中,占用内存最大的则基本确定了共用体占用的大小,精确的大小则是这样确定的:成员中占用最小内存的内存大小作为内存分配单元,最终的共用体大小一定是最小内存大小的倍数。然后可能稍微比最大的成员占用的内存大小大一点或者相等。比如说共用体有两个成员,第一个是整型,占四个字节,第二个成员是一个15个字节的字符数组。此时,成员最小的是整型,4个字节,因此共用体最终的大小是4的整倍数,如4,8,12,16,20等,然后与最大的成员进行匹配,得到最适合的大小又占用空间最小。这样一综合,那15就与16最接近。有人会问,为什么是与16匹配,而不是12.这问题在是比较明显的。因为如果设置为12,那15个字节的成员就分配不到足够的内存,那就没意义了。这样的策略,以最小大小分单位,以最大的为容量,这还是充分利用内存的策略。
    那么我们来理解其使用原理。公用体就是内部的成员公用一段内存,这段内存的大小确定就是由上述讨论的规则定出来的,实现的效果就是达到了共用内存并且还是最少的内存,双重节省内存。我想,说到这里,读者应该很清楚共用体设计的目的了吧。所以在使用时也不要盲目的使用,在不需要节省内存时就不用大费周折来用共用体,用结构体就很方便。只是在节省内存需求下,使用共用体。共用体的好处就是节省内存,不过为了节省内存,也会带来其他问题,这也是我们要理性选择使用的原因。共享内存的原理就是,几个成员公用一个内存区域,谁使用,那这块内存就属于它一个人的,它可以自由存取数据,这样一来,之前其他成员存的数据就被破坏了。这就是所谓的“覆盖技术”。内存可以重复使用,那个成员都可以用,但是不能用这个来存储成员的数据,因为只要其他成员使用,这里的数据就存放了其他成员的数据。都虎视眈眈的盯着这块肥肉,你不怕你的肥肉被叼走就试试吧。所以,如果不理解而误把共用体当成是结构体,后果不堪设想,产生的错误很多时候很难查得出来。共用体类型的定义方法以及使用方法和结构体枚举类似。举一个例子说明。

union U_TYPE
{
    int age;
    char ch;
};
U_TYPE val;
val.age = 15;//此时val中只有age这个数据,且占用了4个字节。
val.ch = 'A;//此时,字母A存入了共用体公共的内存中,字母A就存放到了第一个字节处。后面的三个字节还是第一次存入的二进制数据。不过此时,因为第一个字节已经被ch占用了,那么age就被破坏了,age就不存在了,也就是被ch覆盖了。
val.age = 20;//此时又将20存入这块内存,整型的20占四个字节,将四个字节占满,里面的所有数据都是用来表示20 的,之前的数据就彻底没有了。

    所以说,当前使用的成员才是有效的成员,其他的都是无效的。这就是共用体的概念,以及覆盖的结果。
    一般情况,使用共用体要注意到这点,否则搞不好就被弄糊涂了。了解到这些,共用体的使用和理解就够了,平时编程基本没有问题了。不过,为了加深印象和理解,不熟悉的朋友在看完本文后,理解其中的思想,再看看书中的细节语法,你会感觉So Easy的。
    如果还有疑问,尽情提出。友情提示一句,要精通编程,内存的熟悉,以及用内存的角度来分析,很多东西就轻而易举的明白了。