zoukankan      html  css  js  c++  java
  • Struct 和 Union 的详细区别

    Union: 共用体

    Struct:结构体

    两者的区别:

    1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量。

    2:对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的

    3:内存分配不同

    union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小
    如:
    typedef Union 
    {
    char c[10];
    char cc1;
    }u11;

    typedef union 
    {
    char c[10];
    int i;
    }u22;

    typedef union 
    {
    char c[10];
    double d;
    }u33;

    sizeof(u11)结果是10
    sizeof(u22)结果是12,按照sizeof(int)*3分配空间
    sizeof(u33)结果是16,按照sizeof(double)*2分配空间。

    结构体struct非配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关
    如:
    typedef struct s1
    {
    char c;
    double d;
    }s11;


    typedef struct s2
    {
    char c;
    char cc;
    double d;
    }s22;

    typedef struct s3
    {
    char c;
    double d;
    char cc;
    }s33;

    sizeof(s11)结果是应该是9,但是系统按照sizeof(double)*2分配,所以大小是16

    sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*2分配,所以大小是16,先分配8字节给cc占用一个字节,剩余7字节可以存储cc,所以系统没有额外给cc分配内存。cc有了内存后剩余6字节无法存储d,系统就额外为d分配8字节,整个分配浪费内存6字节。

    sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*3分配,所以大小是24,因为和定义顺序有关,所以当给c分配8个字节之后,剩余7个字节无法存储d,所以系统又分配了8个字节给d,之后又分配8个自己给cc,分配完后浪费了14个字节的空间。所以,在定义结构体struct 的时候按照s33的顺序分配可以节省内存。

  • 相关阅读:
    Windows PE变形练手3-把通用模板机器码直接覆盖目标PE
    Windows PE变形练手2-开发一套自己的PE嵌入模板
    R3抹掉加载的DLL
    R3获取kernel32地址
    Windows PE变形练手1-用PE自己的机器码修改自己的逻辑
    Windows PE 第十三章 PE补丁技术
    Windows PE 第十二章 PE变形技术
    16.PHP_Ajax模拟服务器登录验证
    15.PHP_PHP与Ajax
    14.PHP_PHP与XML技术
  • 原文地址:https://www.cnblogs.com/Unclefeng/p/5019032.html
Copyright © 2011-2022 走看看