关于Union和Struct对齐
2014-04-01 19:26
225 查看
关于union,struct,还有机器数赋值,总是感觉自己认识不是特别深刻,这里使用小DEMO程序加以说明,具体的详细细节描述其它地方已经有说明和记录,这里不再说明。
size is 12
0 5 6
说明:int 此linux环境下占用4字节,结构体a.u本身已经字节对齐,不需要 padding。union对象内部各成员是共用内存,所以 a.k = 0; 修改了 a.u结构体x区域所指向内存的值。
修改代码:
size is 12
0 5 6
说明:注意红色部分,思考为什么 size is 12。实际上,y 前面做了 3 byte 的padding。
修改代码:
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
#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
相关文章推荐
- 关于 struct 和 union 存储时内存边界对齐的问题(二)
- C/C++中关于struct和union的内存对齐原则
- 关于struct和union存储的内存字节对齐的问题
- 关于struct和union存储的内存字节对齐的问题
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- struct结构体和union联合体:字节对齐下的sizeof返回
- C当中关于sizeof(struct)和sizeof(union)
- C当中关于sizeof(struct)和sizeof(union)
- 关于struct对齐
- 转载:关于sizeof对struct和union的处理
- struct/class/union内存对齐原则
- Thinking in C++: C++中关于union、struct、class的区别
- struct/class/union内存对齐原则
- c/c++ struct union 对齐方式
- C/C++中关于struct内存对齐问题
- 关于struct,union,enum三大复合数据类型
- struct与union字节对齐问题
- sizeof union struct 内存对齐
- 关于C与C++的struct,union,enum用法差异
- 自然对齐:sizeof struct, union