zoukankan      html  css  js  c++  java
  • 联合体内存对齐

    union DATE
    {
        char a;
        int i[5];
        double b;
    };
    
    DATE max;
    
    cout<< sizeof(max) << endl;

    这个问题很好回答,并且我把这个问题归结于基本概念题(就是入门书必须介绍的)。我想一般来说,做过内存管理的,对这个语言特性肯定不会陌生。

    摘几句The C Programming Language里面讲述这个问题的原话,以说明读书还是必要的:
    ①联合就是一个结构,②它的所有成员相对于基地址的偏移量都为0,③此结构空间要大到足够容纳最“宽”的成员,④并且,其对齐方式要适合于联合中所有类型的成员。

    怕有的兄弟还不明白,特附图一个帮助理解:

     

    char a; => x                                              
    int i[5]; =>

     x

     x

     x

     x

     x

    x

    double b; =>

     x

     

     


    该结构要放得下int i[5]必须要至少占4×5=20个字节。如果没有double的话20个字节够用了,此时按4字节对齐。但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的,所以必须添加4个字节使其满足8×3=24,也就是必须也是8的倍数,这样一来就出来了24这个数字。综上所述,最终联合体的最小的size也要是所包含的所有类型的基本长度的最小公倍数才行。(这里的字节数均指winnt下的值,平台、编译器不同值也有可能不同。)

  • 相关阅读:
    OpenCV特征描述
    OpenCV特征点检测
    expect实现无交互操作
    文件的修改时间
    sshd登录攻击
    tcp三次握手和syn 洪水攻击
    vim使用
    PHP拓展开发
    【转】LINUX 手动建立SWAP文件及删除
    Ubuntu下crontab命令的用法
  • 原文地址:https://www.cnblogs.com/jincwfly/p/892348.html
Copyright © 2011-2022 走看看