博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++内存结构体联合体所占内存
阅读量:4136 次
发布时间:2019-05-25

本文共 2183 字,大约阅读时间需要 7 分钟。

先明白下面几个事:

32位操作系统和VS32位编译器有区别么?待解答

32位操作系统中:

int 4字节
char 1字节
long 4字节
long long 8字节

64位操作系统中:

int 4字节
char 1字节
long 8字节(为啥验证是4呢,待解答)
long long 8字节

看struct

//64位操作系统struct name1 {        char a;        int b;        long long c;    };//16    struct name2    {        char a;        long long b;        int c;    };//24    struct name3    {        char a;        int b;        int c;    };//12    cout << sizeof(name1) << " " << sizeof(name2) << " "<
<

来一个union

typedef union1 { long  i;int k[5];char c; }DATA;cout << sizeof(DATA) << endl;//输出结果是20

先来解释一下为啥是20?

因为union里所有变量共有一块起始内存,所以要以最大的那个来作为占用内存的值来作为union占用的内存。上述中,int k[5]是占用5*4=20字节,所以是20。(注意这里是以4字节为单位)
但是还有一点点需要继续往下挖!

typedef union2 { long long i;int k[5];char c; }DATA;//如果是long longcout << sizeof(DATA) << endl;//输出结果是24

嘿嘿!想想这里为啥是24,而不是20了呢???

这是本文写的最重要的一点!
原因是:在union里,long long是8字节,而后面跟着的int k[5],是20字节,但是这个20字节是以[4][4][4][4][4]这样存的。前面有个[8]了,要以8字节为单位,int k[5]存储时,要成这样了,[[4][4]][[4][4]][[4][]],注意最后一个[4]后面需要补充一个4字节的。此时最大的还是int k[5],但是占用的内存是24字节。

再来一个struct

struct data {        int cat;DATA cow;double dog;    }too;    DATA max;    cout << sizeof(struct data) <<" "<< sizeof(max) << endl;

//如果DATA是20字节,即union1的,此时输出结果是:32(4+20+8)+20

//如果DATA是24字节,即union2的,此时输出结果是:40(8+24+8)+24
因为第二种是按照8字节对齐的。

再来一个小变化:

typedef union3 { long  i;int k[6];char c; }DATA;cout << sizeof(DATA) << endl;

输出结果是:24

struct data {        int cat;DATA cow;double dog;    }too;    DATA max;    cout << sizeof(struct data) <<" "<< sizeof(max) << endl;

输出结果是:40(8+24+8)+24

好好想想是为啥?(因为double 是8字节,要按照double来对齐)

再来一个:

struct s1    {        int i:8;        int j:4;        int a:3;        double b;    };    cout << sizeof(s1) << endl;

输出结果是:16

首先要明白:int i:8是说i要占8bit的内存。因为最后一个是double,8字节,64bit,所以在struct是以8字节来对齐的,前面8+4+3=15bit,达不到8字节,但是要分配8字节。

struct s1    {        int i:16;        int j:31;        int a:2;        double b;    };    cout << sizeof(s1) << endl;

这个结果是24,这是因为内存是默认以一个4字节为一个对齐单位的。int i自己占用4字节,但是只用16bit,而int j是也是占用4字节,但是只用31bit,最后的a,不得不用4字节。但是要和最后的8字节对齐,所以前两个占用8字节,中间8字节,最后8字节,总共24.

struct s1    {        int i:16;        int j:30;        int a:2;        double b;    };    cout << sizeof(s1) << endl

这个输出结果就是16.(因为j和a可以拼成一个int)。

转载地址:http://fexvi.baihongyu.com/

你可能感兴趣的文章
HDU 4557 非诚勿扰 (简单模拟)
查看>>
HDU 4550 卡片游戏(贪心+细心)
查看>>
蓝桥杯 算法训练 集合运算
查看>>
蓝桥杯 暗恋 简单搜索或者暴力或者bfs
查看>>
蓝桥杯 拦截导弹 动态规划(最长下降子序列+最长上升子序列)
查看>>
蓝桥杯 方格取数 (多线程DP)
查看>>
蓝桥杯 未名湖边的烦恼 (简单暴力dfs)
查看>>
蓝桥杯 黑白无常 (简单暴力枚举)
查看>>
蓝桥杯 基础练习 2n皇后问题 (简单dfs暴力+优化剪枝)
查看>>
蓝桥杯 基础训练 完美的代价(转)
查看>>
蓝桥杯 算法训练 矩阵乘方(矩阵快速幂取模)
查看>>
蓝桥杯 算法训练 数列
查看>>
蓝桥杯 算法训练 校门外的树 (贪心线段排序)
查看>>
蓝桥杯 算法训练 装箱问题 (DP)
查看>>
蓝桥杯 算法提高 上帝造题五分钟(线段树)
查看>>
蓝桥杯 算法提高 学霸的迷宫(简单bfs+记录路径)
查看>>
蓝桥杯 算法提高 扶老奶奶过街
查看>>
蓝桥杯 算法提高 排队打水问题(贪心排序+优先队列)
查看>>
蓝桥杯 算法提高 分苹果
查看>>
蓝桥杯 算法提高 现代诗如蚯蚓
查看>>