内存字节对齐
来源:互联网 发布:淘宝手机自动挂机赚钱 编辑:程序博客网 时间:2024/06/11 18:59
内存字节对齐要领
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的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:
代码
#include <stdio.h>#pragma pack(8)typedef struct bb{ int id; //&BB.id=00000000 [0]....[3] double weight; //&BB.weight=00000008 [8]....[15] 原则1 float height; //&BB.height=00000010 [16]...[19] 原则3 //总长要为8的整数倍,补齐[20]...[23] }BB; //sizeof(BB)=24typedef struct aa{ char name[2]; //&a.name=00000000 [0]-[1] int id; //&a.id=00000004 [4]-[7] 原则1 double score; //&a.score=00000008[8]-[15] short grade; //&a.grade=00000010[16]-[17] BB b; //&a.b=00000018 [24]-[47] 原则2}AA; //sizeof(a)=48int main(void){ BB x; char*p=(char*)&x.id; printf("&x.id=%p \n",p-(char*)&x.id); p=(char*)&x.weight; printf("&x.weight=%p \n",p-(char*)&x.id); p=(char*)&x.height; printf("&x.height=%p \n",p-(char*)&x.id); printf("sizeof(BB)=%d\n\n",sizeof(BB)); AA a; p=(char*)&a.name; printf("&a.name=%p \n",p-(char*)&a.name); p=(char*)&a.id; printf("&a.id=%p \n",p-(char*)&a.name); p=(char*)&a.score; printf("&a.score=%p \n",p-(char*)&a.name); p=(char*)&a.grade; printf("&a.grade=%p \n",p-(char*)&a.name); p=(char*)&a.b; printf("&a.b=%p \n",p-(char*)&a.name); printf("sizeof(a)=%d\n",sizeof(a));}
结果是
sizeof(a))=48 sizeof(BB)=24
ok,上面的全看明白了,内存对齐基本过关.
再讲讲#pragma pack().
在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为
32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;
这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.
0 0
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐详解
- 内存中字节对齐
- c++ 内存 字节对齐
- 内存字节对齐详解
- 内存字节对齐
- 内存字节对齐
- 内存字节对齐
- 关于字节内存对齐
- 内存字节对齐总结
- 内存字节对齐总结
- 内存字节对齐
- 内存字节对齐
- 关于内存字节对齐
- 内存字节对齐
- 内存字节对齐
- EM算法小结
- 【2015合肥网络赛】(没有补完)
- IOS 点击屏幕空白部分关闭键盘方法
- Java资源大全
- 感悟
- 内存字节对齐
- 常用的Post提交类型
- 转:java正则表达式大全
- Xcode 报错
- 深入剖析Java中的装箱和拆箱
- 一个页面中iframe之间的值的传递
- 图解Java内存回收机制
- php
- intelij idea+springMVC+spring+mybatis 初探(持续更新)