读书人

个c union的小疑点虽然简单但是想

发布时间: 2013-09-17 13:35:59 作者: rapoo

弱弱的问个c union的小问题,虽然简单,但是想不通啊
union
{
char flag[3];
short value;
} sampleUnion;

void main()
{
cout<<sizeof(sampleUnion)<<endl;

}

这个union的sizeof为什么是4啊,请指教
[解决办法]
没仔细研究过。
对齐吧。满足每个成员类型的整数倍且放得下最大的成员。
char 是1
short 是2

union
{
char flag[5];
short value;
int i;
} sampleUnion;

size 是 8

union
{
char flag[11];
short value;
int i;
double d;
} sampleUnion;

size 是16
[解决办法]
我们老师说这好像叫做内存优化。首先short在内存中占的字节数为2,一个char为1,这是一个数据类型在内存占用的内存单元。但是在这个union中,它要做内存的优化,也就说先计算谁占用的字节数最多。char flag[2]中的flag[0]和flag[1]在内存中挨在一块。剩下的flag[2]和一个字节的空白单元挨在一块。共占4字节,这个4字节就比short大了,可以容纳下short。
[解决办法]
默认4字节对齐
[解决办法]
重要的一点是联合体是共用内存的,还有一点就是字节对齐了~~
[解决办法]
就是字节对齐的原因,规则如下:
请牢记以下3条原则:(在没有#pragma pack宏的情况下,务必看完最后一行)

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

读书人网 >C语言

热点推荐