浏览 2123 次
锁定老帖子 主题:linux下的数据对齐
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-25
对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个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。在有的机器架构上,就能检测并处理这个问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-27
比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.
为何说地址最后两位是0? |
|
返回顶楼 | |