您的位置:首页 > 其它

struct与union的对齐方式解析

2017-07-23 20:03 225 查看
一、Struct 和 Union有下列区别:

1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而union每个成员会用同一个存储空间,只能存储最后一个成员的信息

2.都是由多个不同的数据类型成员组成,但在任何同一时刻,union只存放了一个被先选中的成员,而结构体的所有成员都存在

3.对于union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的

注:在很多地方需要对结构体的成员变量进行修改。只是部分成员变量,那么就不能用联合体union,因为union的所有成员变量占一个内存。eg:在链表中对个别数值域进行赋值就必须用struct.
二、实例说明

struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式。

union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union的内存size 由类型最大的元素 size 来确定,如下的内存就为一个double 类型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1
}x;

所以分配的内存 size 就是8 byte。

既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

eg:  Sample联合只包含其中某一个成员,要么是index,要么是price。

union Sample {

   int index;

   double price; };
若   Sample ss; ss.index =10;// 从今往后只能使用ss.index

若   Sample ss; ss.price=14.25;// 从今往后只能使用ss.price

 在union的使用中,如果给其中某个成员赋值,然后使用另一个成员,是未定义行为,后果自负。
struct成员是互相独立的,一个struct包含所有成员。

C/C++ code

struct Example

{

int index;

double price;

};

Example结构包含两个成员,修改index不会对price产生影响,反之亦然。

union的成员共享内存空间,一个union只包含其中某一个成员。

说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用struct和union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用union,从而节省内存size; struct和union还可以相互嵌套。

三、内存对齐方式

union u

{

 double a;

 int b;

};

union u2

{

 char a[13];

 int b;

};

union u3

{

 char a[13];

 char b;

};

cout<<sizeof(u)<<endl; // 8

cout<<sizeof(u2)<<endl; // 16

cout<<sizeof(u3)<<endl; // 13

  都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。

  结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: