全部博文(930)
分类: LINUX
2009-11-23 13:49:06
对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个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。在有的机器架构上,就能检测并处理这个问题。