六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 117|回复: 0

linux下的数据对齐

[复制链接]

升级  98%

57

主题

57

主题

57

主题

秀才

Rank: 2

积分
197
 楼主| 发表于 2013-1-27 04:36:00 | 显示全部楼层 |阅读模式
数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个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 <stdlib.h>#include <stdio.h>int main(){    char *buf;    posix_memalign(&buf,128,1024);    printf("[%d]\n",buf);    free(buf);    return 1;}

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

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

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

这里badnews指针就可能会没有对齐,因为char是1字节对齐的,而转换后的ul是4或8字节对齐的,在有的机器上就有可能引起程序的crash。在有的机器架构上,就能检测并处理这个问题。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表