您的位置:首页 > 其它

c中union和struct类型的大小计算

2014-10-10 15:29 99 查看
规则:

1,对于union,对齐的大小是最大的基本元素的对齐大小;对象的大小必须是该基本元素大小的整数倍;

2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。

3,这里所说的struct和union的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。

例子一:

union U1

{

char a[9]; //对齐大小是1,大小是9个字节

int b; //对齐大小是4,大小是4个字节

};

所以该union的对齐大小是4个字节;大小为大于等于max(9,4)=9并为4的整数倍,所以是12字节。

例子二:

union U1_Another

{

char a[9]; //对齐大小是1,大小是9个字节

double b; //对齐大小是8,大小是8个字节

};

所以该union的对齐大小是8个字节,大小是大于等于9并为8的整数倍,即为16字节;

例子三:

union U2

{

U1 a; //对齐大小是4个字节,大小是12字节

double b; //对齐大小是8个字节,大小是8字节

};

所以该union的对齐大小是8个字节,大小是16;

例子四:

struct S1

{

char a[13]; //对齐大小是1字节,位置是[0,12]

double c; //对齐大小是8字节,位置是[16,23]

}

所以该结构体是8字节对齐,大小为24个字节;

例子五:

struct S2

{

S1 a; //对齐大小是8字节,位置是[0,23]

U1 b; //对齐大小是4字节,位置是[24,35]

};

所以该结构体的对齐大小是8字节,大小是40字节;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: