最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

内存中的字节对齐详解【摘要】

工作和技术 crifan 2191浏览 0评论

内存中的字节对齐详解【摘要】

字节对齐的优点:
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

转载请注明:在路上 » 内存中的字节对齐详解【摘要】

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.157 seconds, using 22.12MB memory