关于Union和Struct对齐

来源:互联网 发布:如何利用碎片时间知乎 编辑:程序博客网 时间:2024/05/22 14:17

关于union,struct,还有机器数赋值,总是感觉自己认识不是特别深刻,这里使用小DEMO程序加以说明,具体的详细细节描述其它地方已经有说明和记录,这里不再说明。

#include <stdio.h>union myun {struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =4;a.u.y =5; a.u.z =6; a.k = 0; int size = sizeof(a.u);printf("size is %d \n",size);printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);return 0;}
Output:

size is 12

0  5  6

说明:int 此linux环境下占用4字节,结构体a.u本身已经字节对齐,不需要 padding。union对象内部各成员是共用内存,所以 a.k = 0; 修改了 a.u结构体x区域所指向内存的值。
修改代码:

union myun {struct { int x; char y; int z; }u; int k; }a; int main() { a.u.x =4;a.u.y =5; a.u.z =6; a.k = 0; int size = sizeof(a.u);printf("size is %d \n",size);printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);return 0;}
Output:

size is 12

0  5  6

说明:注意红色部分,思考为什么 size is 12。实际上,y 前面做了 3 byte 的padding。

修改代码:

union myun {struct { char x; char y; int z; }u; int k; }a; int main() { a.u.x =4;a.u.y =5; a.u.z =6; a.k = 65535; int size = sizeof(a.u);printf("size is %d \n",size);printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);return 0;}

Output:

size is 8

-1  -1  6

说明:注意红色部分,思考为什么 size is 8。实际上,x 前面做了 2 byte 的padding。

至于为什么 a.u.x  = -1, a.u.y = -1; 实际上,a.k = 0xffff,从机器码的角度看 a.u.x 和 a.u.y 内存空间上是全 1,然后我们进行补码翻译,翻译成原码,得到其值 -1。这里注意机器表示是用补码表示,最后值的解释如果能够翻译成原码用原码解释,实际上就是机器数(带有符号的真值)。


备注:

具体关于内存对齐,请参阅之前的一篇博文:

http://blog.csdn.net/yj512029078/article/details/22734105

0 0
原创粉丝点击