C++ 中struct,class及union 内存空间分配
来源:互联网 发布:中世纪2优化9毛子 编辑:程序博客网 时间:2024/05/19 19:31
简述:
测试下在struct, class以及union分配内存大小时候会出现的问题
1.class ,struct部分
首先看一段代码, 猜测下输出是多少
#include <iostream>using namespace std;union Data0{char a[9];double b;};union Data1{Data0 a;char b;};struct Data2{Data0 a;char b;};int main() {cout << "sizeof Data0 " << sizeof(Data0) << endl;cout << "sizeof Data1 " << sizeof(Data1) << endl;cout << "sizeof Data2 " << sizeof(Data1) << endl;return 0;}
这里有三个结构体Data0, Data1, 和Data2
我们都知道一个int是4个Byte , 一个double是8个Byte, 一个char是一个Byte大小
显然可以推测Data1这个结构体的大小是2 x 4 = 8 个Byte大小
但是, 如果我们认为Data2的大小是4 + 8 = 12的话那就错了!!
因为 :结构体的总大小,也就是sizeof的结果,. 必须是其内部最大成员的"最宽基本类型成员"的整数倍.不足的要补齐.(基本类型不包括struct/class/uinon)
所以double和int如果都在一个结构体里,那么int将被自动分配空间为8个Byte(尽管他本身只占4个Byte)
所以Data2的size是8 + 8 = 16
同理,Data3中多出来的那个char 虽然本身只需要8 + 1个Byte, 但是本着内存对齐原则, 多出来的那个char将自动补为8位 所以结果式8 + 8 + 8 = 24
struct输出:
2 .union部分
首先union的内存分配原则,是不同于struct的累加方式的, union本身只保留一块地址空间,因为只有一个成员真正存储于该地址, 但这块地址也要满足内存对齐原则
看这段代码,猜测下结果:
#include <iostream>using namespace std;union Data0{int a;int b;};union Data1{double a;int b;};union Data2{char a[9];double b;};int main() {cout << "sizeof union Data0 " << sizeof(Data0) << endl;cout << "sizeof union Data1 " << sizeof(Data1) << endl;cout << "sizeof union Data2 " << sizeof(Data2) << endl;return 0;}
由于每次只保留一个基本变量的空间,所以Data0 可以猜到,只保留一个int的空间是4个Byte
然后看Data1 由于选取最大的单个基本变量空间,所以选取double 为8个Byte
Data2中, 最大单个基本变量是char数组为9个Byte,但是因为有double存在,因为要内存对齐,所以多余的那1个char自动转为 8 Byte的地址空间
所以,这个Data2的union大小为8 + 8 = 16
union输出:
3. Union Struct 混合部分
代码:
#include <iostream>using namespace std;union Data0{char a[9];double b;};union Data1{//use the smallest length Data0 : 16Data0 a;char b;};struct Data2{//the smallest length is double : 8 byteData0 a;char b;};int main() {cout << "sizeof Data0 " << sizeof(Data0) << endl;cout << "sizeof Data1 " << sizeof(Data1) << endl;cout << "sizeof Data2 " << sizeof(Data2) << endl;return 0;}
把Union对象Data0封装到Data1, 和Data2中,
在分配空间的时候,会类似拆分Data1 和Data2中的union对象,原则还是如上面两种, 不过如果成员是union,那么即使外面试struct遵循的方式还是Union
输出:
- C++ 中struct,class及union 内存空间分配
- C --struct union内存分配
- C/C++中 union/struct/class的内存对齐
- c/c++中使用sizeof计算union/struct/class
- C/C++ struct/class/union内存对齐
- C/C++ struct/class/union内存对齐
- C/C++ struct/class/union内存对齐
- C++中class、struct、union的区别
- struct union 内存分配
- C++,C中struct的区别,及class
- class, struct, union
- struct,class,union
- Thinking in C++: C++中关于union、struct、class的区别
- C/C++分配内存空间
- C++new分配内存空间
- C分配内存空间
- C语言union中包含struct 小结
- c中枚举类型enum, struct, union
- 一天一个算法题-简单的-递归
- 实验:常用控件
- Android上的一点心得
- testing
- oracle权限和同义词 笔记
- C++ 中struct,class及union 内存空间分配
- C++ 对象的内存布局(上)
- C++ 对象的内存布局(下)
- C++ 虚函数表解析
- hdu1394~线段树求和
- SAP BW常用后台事务码
- linux下 getch ()的实现
- 与黑夜有染.
- Getting the error “The view at '~/Views/Page/home.aspx' must derive from ViewPage, ViewPage<TViewDat