• struct和union的区别


    当初学习C语言时并没有特别注意 union 的用法,也不知道与 struc t相比有何不同。经过网上的一番搜索,现在总算是恍然大悟,所以就小结一下。如有错误之处,敬请指正。( struct  union 的结构定义形式没有多大差别,只要不是初学者,相信大家不会在这方面存在什么问题。)

     

    struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

    struct sTest

    {

    int a;  //sizeof(int) = 4

    char b;  //sizeof(char) = 1

    shot c //sizeof(shot) = 2

    }x;

    所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式,可以参考转载的《 struct 字节对齐分析》,介绍的还是不错的。

     

    union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给 union 的内存 size 由类型最大的元素 size 来确定,如下的内存就为一个 double 类型 size 

    union uTest

    {

    int a;   //sizeof(int) = 4

    double b;  //sizeof(double) = 8

    char c;  //sizeof(char) = 1

    }x;

    所以分配的内存 size 就是8 byte

    既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

    x.a = 3; x.b = 4.5; x.c = ‘A’;

    这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

     

    说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用 struct  union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用 union ,从而节省内存size struct  union 还可以相互嵌套。

  • 相关阅读:
    修改CentOS 6.4 root用户的系统默认语言设置
    Xpages学习
    Mysql 执行sql脚本文件
    Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 'XXX'.
    【鸟哥学习笔记】之一:目录的权限问题
    学习C++的一些问题总结
    C# 一些知识点总结(一)_继承,多态,集合,关键字...
    .NET Framework 框架的一些简单介绍
    Winform窗体关闭时判断是否关闭
    SQL Server 数据库的安全管理(登录、角色、权限)
  • 原文地址:https://www.cnblogs.com/kb342/p/3956778.html
Copyright © 2020-2023  润新知