C++内存结构体联合体所占内存
来源:互联网 发布:100~200的质数c语言 编辑:程序博客网 时间:2024/05/22 12:08
先明白下面几个事:
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) << " "<<sizeof(name3)<<endl;//输出结果如上面的注释
来一个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)。
- C++内存结构体联合体所占内存
- 结构体所占内存
- C/C++结构体所占内存的问题
- 如何计算C语言中结构体所占内存
- 结构体所占内存字节
- 关于常用数据内存占用的常见问题(数据类型所占内存容量、大端小端、结构体联合体)
- 结构体,联合体,内存分配
- 结构体,联合体,内存分配
- 结构体Record所占内存的大小
- C语言程序所占内存分类
- C语言程序所占内存分类
- C语言程序所占内存
- 变量类型所占内存C/C++
- C/C++ 不同数据类型所占内存
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- 指针所占内存剖析
- android汉字所占内存
- Linux内核移植 part3:Exynos4412内核编译
- 欢迎使用CSDN-markdown编辑器
- Okhttp 框架使用和源码分析
- Spring进行Bean配置的方式:Annotation VS Xml
- nginx正向代理
- C++内存结构体联合体所占内存
- ubuntu+shadowsocks+switchyomega
- Redis服务器安装和配置远程访问
- maven学习
- LINUX-成长记录
- 2017年计划
- DDL和DML
- final变量
- 关于json解析异常,在线等新手别嫌分少