Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826236
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-11-23 13:49:06

数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.

  对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个processor trap.而有些系统则很安全,不过会使性能降低。

  这里如果我们想要更大的数据对齐边界,比如按页来对齐,这时我们可以使用这个函数:

posix_memalign(void **memptr, size_t alignment, size_t size);

  调用这个函数将会分配一个size大小的动态内存,而他的地址则是alignment的倍数。这里要注意alignment必须是2的倍数。释放分配的内存也使用函数free。

#define XOPEN_SOURCE 600 
#include  
#include  
int main() 
{ 
  char *buf; 
  posix_memalign(&buf,128,1024); 
  printf("[%d]\n",buf); 
  free(buf); 
  return 1; 
}

  可以看到buf刚好是128的倍数。

  这里我们可以看一个强制转换引起的地址没有自然对其的例子:

#include  
int main() 
{ 
 
  char foo[]="bo"; 
  char *c = &foo[0]; 
  unsigned long badnews = *( unsigned long *) c; 
  return 1; 
}

  这里badnews指针就可能会没有对齐,因为char是1字节对齐的,而转换后的ul是4或8字节对齐的,在有的机器上就有可能引起程序的crash。在有的机器架构上,就能检测并处理这个问题。

阅读(2855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~