zoukankan      html  css  js  c++  java
  • Union和struct的内存分配区别

    今天看到有一段程序里在struct里面用了个Union,然后就突然想到了struct和Union的区别,
    找了些资料后发现,struct和Union在内存分配的时候有区别,Union里的数据是公用一块内存……,所以给其分配的内存总是Union里面所定义的最大类型长度的整数倍。
         而struct里的数据跟Union不一样,它们不共享一块内存,他是按照struct里面定义的数据顺序来进行分配内存的,但是分配的基本单位是struct里面所定义的最长的数据类型的长度。
    举个形象的例子:
    struct里面定义的数据类型的顺序为:
    int a;
    char b;
    double c;
    那个系统分配给这个struct的内存空间是多少呢?
    应该是16!
    为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c

    试想下如果struct里面定义的数据类型的顺序为:
    int a;
    double b;
    char c;
    那个系统分给这个struct的内存空间又是多少呢?
    应该是24!
    知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。
    所以在结构体里面最好按照类型从小到大的顺序来……
    #include <iostream>
    using namespace std;
    struct A1
    {
        char s;
        double b;
    };
    struct A2
    {
        char s1;
        double b;
        char s;
    };
    struct A3
    {
        char s1;
        char s3;
        double b;
    };
    union B1
    {
        char a;
        double b;   
    };
    union B2
    {
        char a;
        char a1;
        double b;
    };
    union B3
    {
        char a;
        double b;
        char a1;
    };
    union B4
    {
        int a[5];
        double b;
    };
    int main()
    {
        cout<<sizeof(A1)<<endl;
        cout<<sizeof(A2)<<endl;
        cout<<sizeof(A3)<<endl;
        cout<<sizeof(B1)<<endl;
        cout<<sizeof(B2)<<endl;
        cout<<sizeof(B3)<<endl;
        cout<<sizeof(B4)<<endl;
        return 0;
    }
    运行结果为:
    16
    24
    16
    8
    8
    8
    24

    一个网上的好例子:http://blog.chinaunix.net/u2/84450/showart_1829958.html

    在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也
    可以使用联合体来发挥其长处。首先看一段代码:
    union myun
    {
    struct { int x; int y; int z; }u;
    int k;
    }a;
    int main()
    {
    a.u.x =4;
    a.u.y =5;
    a.u.z =6;
    a.k = 0;
    printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
    return 0;
    }
    union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6
  • 相关阅读:
    Android报表库aChartEngine系列(pie chart)
    二分查找算法java实现
    Android报表库aChartEngine系列(介绍)
    如何自定义view
    服务器性能瓶颈分析方法
    浅析C#中new、override、virtual关键字的区别
    Team Foundation Server 实例安装过程
    asp.net2.0站点应用程序池错误的问题
    C#字符串去除html标记
    web.config加密的问题
  • 原文地址:https://www.cnblogs.com/luoyaoquan/p/2037080.html
Copyright © 2011-2022 走看看