关于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
- 关于Union和Struct对齐
- 字节对齐(struct 和 union)
- union和struct对齐大小问题
- struct union数据对齐和sizeof大小
- union, struct , sizeof. 对齐
- struct union 内存对齐
- union struct 内存对齐
- struct/union内存对齐
- 关于struct和union存储的内存字节对齐的问题
- 关于 struct 和 union 存储时内存边界对齐的问题(二)
- C/C++中关于struct和union的内存对齐原则
- sizeof(union) 、sizeof(struct) 和内存对齐技术
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- struct和 union用 sizeof 看字节对齐
- 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
- C++:struct和union 内存字节对齐问题
- 关于union和struct的内存分配
- 关于union和struct的内存分配
- makefile自动化变量及其说明
- VC当中将CString转换为char
- 六周 项目1 体验常成员函数 没有写完!!
- win32 api
- Linux内核的Oops
- 关于Union和Struct对齐
- 广播域与冲突域
- 批处理设置永久环境变量
- Yii 中使用import和components引入组件
- SVM入门(四、五)线性分类器的求解——问题的描述
- c语言程序设计
- OD/CE 过掉TMD壳附加检查
- Emag eht htiw Em Pleh
- Linux下ip地址的配置方法