Union内存分布

最近研究union,发现union内存分布挺有意思。

Union定义是什么?

Union是中文名是联合体,类似于struct,但是跟struct有很多区别,里面参数公用内存。

Union和struct的区别

①结构体(struct)中所有变量是"共存"的------优点是"有容乃大",全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

②而联合体(union)中是各变量是"互斥"的------缺点就是不够"包容";但优点是内存使用更为精细灵活,也节省了内存空间。

下面我们通过例子看看Union内存分布。

复制代码
#include <stdio.h>
int main(){
    typedef union {
       long i;
       int k[4];
       char c;    
    }DATE;
    struct data
    {
        int cat;
        DATE cow;
        double dog;
    }too;
    DATE max;
    long a = 0;
    printf("%ld , %ld ,%ld\r\n",sizeof(struct data),sizeof(max),sizeof(struct data)+sizeof(max));
    printf("%p,%p ,%p\r\n", &max.i,&max.k,&max.c);
    printf("%ld\r\n",sizeof(long));
    return 0;
    
}

上面代码运行结果是

复制代码
32 , 16 ,48
0x7ffc73484f50,0x7ffc73484f50 ,0x7ffc73484f50
8

看到第二行,访问Union变量里面的参数,地址都是一样的,完全就是共用一个内存首地址,并且各种变量名都可以同时使用,操作也是共同生效

内存分配

根据上面代码,union分配内存大小是16,因为long i 内存分配大小是8,int k[4]大小是16,char c分配大小是1,说明union分配大小是根据最大参数内存大小分配。

但是如果把int k[4]改成k[5]呢,上面结果会出现什么?

复制代码
#include <stdio.h>
int main(){
    typedef union {
       long i;
       int k[5];
       char c;    
    }DATE;
    struct data
    {
        int cat;
        DATE cow;
        double dog;
    }too;
    DATE max;
    long a = 0;
    printf("%ld , %ld ,%ld\r\n",sizeof(struct data),sizeof(max),sizeof(struct data)+sizeof(max));
    printf("%p,%p ,%p\r\n", &max.i,&max.k,&max.c);
    printf("%ld\r\n",sizeof(long));
    return 0;
    
}

运行结果是

复制代码
40 , 24 ,64
0x7fffbde34f10,0x7fffbde34f10 ,0x7fffbde34f10
8

此时union分配内存大小是24,前面不是说好了union分配大小是根据最大参数内存大小分配吗?

下面还有个概念,就是内存对齐,因为在64位机器上,long站8个字节,int k[5]占用20个字节,

但是由于内存对齐的原因,系统会将联合体的大小调整为最大成员大小的整数倍,即24个字节(20不是8的整数倍,所以会向上取整到24个字节)。

相关推荐
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 68: 猜数字大小II、矩阵中的最长递增路径
数据结构·算法·leetcode·职场和发展·贪心算法·矩阵·深度优先
灵感__idea3 小时前
Hello 算法:让前端人真正理解算法
前端·javascript·算法
学习2年半4 小时前
小米笔试题:一元一次方程求解
算法
MATLAB代码顾问4 小时前
MATLAB绘制多种混沌系统
人工智能·算法·matlab
极客BIM工作室4 小时前
演化搜索与群集智能:五种经典算法探秘
人工智能·算法·机器学习
qq_574656254 小时前
java-代码随想录第66天|Floyd 算法、A * 算法精讲 (A star算法)
java·算法·leetcode·图论
金融街小单纯5 小时前
从蓝军建设中学习颠覆性质疑思维
人工智能·算法·机器学习
少许极端6 小时前
算法奇妙屋(五)-链表
数据结构·算法·链表
XISHI_TIANLAN6 小时前
【多模态学习】Q&A6: 什么是MOE架构?Router Z Loss函数是指什么?负载均衡损失(Load Balancing Loss)又是什么?
学习·算法·语言模型
木子.李3477 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法