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

  • 相关阅读:
    【webpack 系列】进阶篇
    【webpack 系列】基础篇
    手写 Promise 符合 Promises/A+规范
    React-redux: React.js 和 Redux 架构的结合
    Redux 架构理解
    javascript 中的 this 判定
    编译原理
    vue 响应式原理
    强大的版本管理工具 Git
    js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
  • 原文地址:https://www.cnblogs.com/Unclefeng/p/5019032.html
Copyright © 2011-2022 走看看