复合类型的字节对齐

来源:互联网 发布:数据架构师 编辑:程序博客网 时间:2024/05/22 17:50
联合体、结构体、class 的大小

对于复合类型,union、struct、class的对齐方式为成员中最大的成员对齐方式。

union 联合体:联合体的大小取决于它所有成员中占用空间最大的一个成员大小
例子:
union t1
{
double a;
int b;
char c;
};


union t2
{
char buf[11];
int a;
};

在t1中,对齐方式是double型的8个字节,所以sizeof(t1)=8;
在t2中,对齐方式是int型的4个字节,buf[11]未对齐,最小为12,所以sizeof(t2)=12;


也可以指定对齐方式:

#pragma pack(2)

union t1
{
double a;
int b;
char c;
};

union t2
{
char buf[11];
int a;
};

则在t1中,对齐方式是2个字节,所以最大为sizeof(double),sizeof(t1)=8;
则在t2中,对齐方式是2个字节,buf[11]未对齐,最小为12,所以sizeof(t2)=12;

class 、struct:占用空间最大成员为对齐方式,占用空间大小为所有成员占用空间大小的和

例子:
struct t1
{
int a;
double b;
char c;
};

union t2
{
char buf[11];
int a;
};

在t1中,对齐方式是double型的8个字节,所以b也是8个字节,但他是int类型,多的4个字节可以给c使用,所以sizeof(t1)=8+8+8=24;

注意:在32位的linux系统中,字节对齐方式最大为4个字节,所以a分配4个字节,b分配8个字节,c分配4个字节,sizeof(t1)=4+8+4=16;即使使用#pragma pack()设置对齐方式>4,也会按4进行字节分配。


在t2中,对齐方式是int型的4个字节,buf[11]未对齐,最小为12,所以sizeof(t2)=12+4=16;

也可以指定对齐方式:
#pragma pack(2)
union t1
{
double a;
int b;
char c;
};

union t2
{
char buf[11];
int a;
};

则在t1中,对齐方式是2个字节,sizeof(t1)=8+4+2=14;
则在t2中,对齐方式是2个字节,buf[11]未对齐,最小为12,所以sizeof(t2)=12+4=14;


原创粉丝点击