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的顺序分配可以节省内存。

  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/Unclefeng/p/5019032.html
Copyright © 2011-2022 走看看