您的位置:首页 > 编程语言 > C语言/C++

C++ 中struct,class及union 内存空间分配

2012-09-25 01:01 423 查看
简述:

测试下在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

输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: