对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系。一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned)。例如,对于一个32bit的变量,如果它的地址是4的倍数,-- 就是说,如果地址的低两位是0,那么这就是自然对齐了。所以,如果一个类型的大小是2n个字节,那么它的地址中,至少低n位是0。对齐的规则是由硬件引起 的。一些体系的计算机在数据对齐这方面有着很严格的要求。在一些系统上,一个不对齐的数据的载入可能会引起进程的陷入。在另外一些系统,对不对齐的数据的 访问是安全的,但却会引起性能的下降。在编写可移植的代码的时候,对齐的问题是必须避免的,所有的类型都该自然对齐。 预对齐内存的分配 在大多数情况下,编译器和C库透明地帮你处理对齐问题。POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于任何的C类型来说都是对齐的。在Linux中,这些函数返回的地址在32位系统是以8字节为边界对齐,在64位系统是以16字节为边界对齐 的。有时候,对于更大的边界,例如页面,程序员需要动态的对齐。虽然动机是多种多样的,但最常见的是直接块I/O的缓存的对齐或者其它的软件对硬件的交 互,因此,POSIX 1003.1d提供一个叫做posix_memalign( )的函数: /* one or the other -- either suffices */ #define _XOPEN_SOURCE 600 #define _GNU_SOURCE #include int posix_memalign (void **memptr, size_t alignment, size_t size); * See http:///FreeSoftware/ElectricFence/ and http://, respectively. 调用posix_memalign( )成功时会返回size字节的动态内存,并且这块内存的地址是alignment的倍数。参数alignment必须是2的幂,还是void指针的大小的倍数。返回的内存块的地址放在了memptr里面,函数返回值是0. 调用失败时,没有内存会被分配,memptr的值没有被定义,返回如下错误码之一: EINVAL 参数不是2的幂,或者不是void指针的倍数。 ENOMEM 没有足够的内存去满足函数的请求。 要注意的是,对于这个函数,errno不会被设置,只能通过返回值得到。 由posix_memalign( )获得的内存通过free( )释放。用法很简单: char *buf; int ret; /* allocate 1 KB along a 256-byte boundary */ ret = posix_memalign (&buf, 256, 1024); if (ret) { fprintf (stderr, "posix_memalign: %s\n", strerror (ret)); return -1; } /* use 'buf'... */ free (buf); |
|
来自: nuster > 《cplusplus》