C++ 中struct,class及union 内存空间分配
2012-09-25 01:01
423 查看
简述:
测试下在struct, class以及union分配内存大小时候会出现的问题
1.class ,struct部分
首先看一段代码, 猜测下输出是多少
这里有三个结构体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输出:
![](http://img.my.csdn.net/uploads/201209/25/1348506220_4650.JPG)
看这段代码,猜测下结果:
由于每次只保留一个基本变量的空间,所以Data0 可以猜到,只保留一个int的空间是4个Byte
然后看Data1 由于选取最大的单个基本变量空间,所以选取double 为8个Byte
Data2中, 最大单个基本变量是char数组为9个Byte,但是因为有double存在,因为要内存对齐,所以多余的那1个char自动转为 8 Byte的地址空间
所以,这个Data2的union大小为8 + 8 = 16
union输出:
![](http://img.my.csdn.net/uploads/201209/25/1348506226_2287.JPG)
3. Union Struct 混合部分
代码:
把Union对象Data0封装到Data1, 和Data2中,
在分配空间的时候,会类似拆分Data1 和Data2中的union对象,原则还是如上面两种, 不过如果成员是union,那么即使外面试struct遵循的方式还是Union
输出:
测试下在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 : 16 Data0 a; char b; }; struct Data2{ //the smallest length is double : 8 byte Data0 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# 使用 StructLayoutAttribute 时 C# /C++ 内存空间分配与成员对齐问题
- C/C++中 union/struct/class的内存对齐
- C++学习笔记 内存空间分配(new/delete)
- C/C++内存空间的分配
- C++ struct,class的内存对齐
- C/C++中关于struct和union的内存对齐原则
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- c / C++ 中的struct 和memcpy函数 class 对象成员变量内存是否连续
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- C++ 中的union、struct和class的异同
- C++中类对象的内存空间分配
- struct和union在内存所占空间
- C++:struct和union 内存字节对齐问题
- (转)结构体struct && 联合union 内存分配
- 关于union和struct的内存分配
- Windows内存管理机制及C++内存分配实例(一):进程空间
- C/C++ struct初始化/复制/内存分配技巧
- C --struct union内存分配
- 一句话总结.Net下struct和class内存分配方面的区别
- struct和union在内存中占用空间大小的计算