zoukankan      html  css  js  c++  java
  • C语言中的联合体union所占内存方式

     当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:

         1)联合体是一个结构;

         2)它的所有成员相对于基地址的偏移量都为0;

         3)此结构空间要大到足够容纳最"宽"的成员;

         4)其对齐方式要适合其中所有的成员;

    下面解释这四条描述:

      由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。

      为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式

    示例:

    union U
    {
        char s[9];
        int n;
        double d;
    };

    上面的程序中的,

    s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。

    然而其实际大小并不是9,用运算符sizeof测试其大小为16.

    这是因为这里存在字节对齐的问题,9既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。

    从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:

                                                      1)大小足够容纳最宽的成员;

                                                      2)大小能被其包含的所有基本数据类型的大小所整除。

  • 相关阅读:
    python学习笔记(二)-字符串方法
    python学习笔记(一)-基础知识
    Charles抓包工具断点修改返回内容
    Charles抓包工具过滤网络请求
    Jmeter通过正则表达式提取器提取响应结果数据
    【PHP】什么时候使用Try Catch(转)
    【tp5.1】七牛云上传图片
    【PHP】统计问卷调查结果的选项票数和百分比
    【tp5.1】composer安装PHPExcel以及导入导出Excel
    【tp5.1】微信公众号授权登录及获取信息录入数据库
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/9685427.html
Copyright © 2011-2022 走看看