论坛首页 编程语言技术论坛

linux下的数据对齐

浏览 2123 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-25  
C
数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个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。在有的机器架构上,就能检测并处理这个问题。







   发表时间:2008-11-27  
比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.

为何说地址最后两位是0?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics