结构体嵌套联合体字节对齐问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体嵌套联合体字节对齐问题相关的知识,希望对你有一定的参考价值。
typedef struct
char name;
short age;
union
char a[9];
int i;
double j;
;
int address;
student;
这个sizeof(student) 为啥是20???实在是搞不懂啊 整个结构体到底是按 联合体最大字节数还是结构体最大字节数对齐?????????
1x 11xxxx 111111111xxxxxxx 1111xxxx (x代表填充位)
需要注意union的字节,union 是按照最大字节类型来对齐(注意是 最大类型的字节,不是总字节)。因此union是按照double 8字节对齐的。而union存在char a[9]。也就是需要9个字节来存储即可,但是!C对内存有 这样的要求:所占内存大小必须是最大类型字节的整数倍,union中最大类型是double 8字节(数组不是类型!!)。因此union需要大于等于 9 同时又是8的倍数。因此就占16个字节。
最好还要注意struct里面最大类型也是double。而不是int。因此最后还要加上4个填充位来变为8个整数倍。 参考技术A 为了提速之类的,在结构体和联合体的内存块中,是按照一定的规则安排的
联合体:
联合体的内存不会为了所有成员安排,而是只取最大的成员的所需内存大小,每次只能使用其中一个成员。但是有一个问题:
[cpp] view plain copy
typedef union
char a;
int[5] b;
double c;
当然只取最大的int数组的大小20没错,但是double是8字节的,而此时联合体已经按int的4字节对齐了,所以还要额外多加4字节的内存来保证8的倍数。所以最后结果是24
所以联合体的内存除了取最大成员内存外,还要保证是所有成员类型size的最小公倍数追问
没有回答我的问题啊
以上是关于结构体嵌套联合体字节对齐问题的主要内容,如果未能解决你的问题,请参考以下文章