内存中的字节对齐详解【摘要】
字节对齐的优点:
1。提高数据存储效率,否则就会两次才能读取一个数据,
或,
避免CPU访问不对齐字节存放数据的内存出错。
2。可以自己设置对齐方式,用
#pragma pack (数字)
。。。。。。。
#pragma pack ()
比如:
#pragma pack (2) /*指定按2字节对齐*/
struct C
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
这样,本来32位的环境下,上述默认按照4字节对齐,占用12字节:
char b :■X X X
int a :■■■■
short c:■■
(注:■表示数据,X表示由于对齐所导致被占用的空字节)
如果按照上面设置的,以2字节对齐的话,就只占用11字节了。
char b :■X
int a :■■■■
short c:■■
3。可以采取显示地插入无用项,用来空间换时间
如:
struct A{
char a;
char reserved[3];//使用空间换时间
int b;
}
4。隐式对齐规则可能导致问题
比如:
unsigned int i = 0x12345678;
unsigned char *p=NULL;
unsigned short *p1=NULL;
p=&i;
*p=0x00;
p1=(unsigned short *)(p+1);
*p1=0x0000;
最后两句代码,从奇数边界去访问unsigned short
在X86上,要两次操作才能取到数据
在强制要求对齐的MIPS或ARM上,就会出现error
5。如何查找与字节对齐方面的问题
如果出现对齐或者赋值问题首先查看
1. 编译器的big little端设置
2. 看这种体系本身是否支持非对齐访问
3. 如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来
标志其特殊访问操作。
内存中的字节对齐详解
的地址:http://blog.chinaunix.net/u/7257/showart.php?id=101402
转载请注明:在路上 » 内存中的字节对齐详解【摘要】