现在的位置: 首页 > 综合 > 正文

数据对齐 posix_memalign 函数详解

2013年08月20日 ⁄ 综合 ⁄ 共 2131字 ⁄ 字号 评论关闭

对齐

        数据的对齐(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(
)的函数:

 

 

SYNOPSIS

[ADV] [Option Start] #include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size); [Option End]

 

DESCRIPTION

The posix_memalign() function shall allocate size bytes aligned on a boundary specified by alignment, and shall return a pointer to the allocated memory in memptr.
The value of alignment shall be a multiple of sizeof( void *), that is also a power of two. Upon successful completion, the value pointed to by memptr shall
be a multiple of alignment.

[CX] [Option Start] The free() function
shall deallocate memory that has previously been allocated by posix_memalign(). [Option End]

RETURN VALUE

Upon successful completion, posix_memalign() shall return zero; otherwise, an error number shall be returned to indicate the error.

 

以上是来自

http://www.kernel.org/doc/man-pages/online/pages/man3/valloc.3.html

 

/* one or the other -- either suffices */
#define _XOPEN_SOURCE 600
#define _GNU_SOURCE
#include <stdlib.h>
int posix_memalign (void **memptr,
                    size_t alignment,
                    size_t size);

* See http://perens.com/FreeSoftware/ElectricFence/ and http://valgrind.org, respectively.


调用posix_memalign( )成功时会返回size字节的动态内存,并且这块内存的地址是alignment的倍数。参数alignment必须是2的幂,还是void指针的大小的倍数。返回的内存块的地址放在了memptr里面,函数返回值是0.


调用失败时,没有内存会被分配,memptr的值没有被定义,返回如下错误码之一:

EINVAL


参数不是2的幂,或者不是void指针的倍数。


ENOMEM


没有足够的内存去满足函数的请求。


要注意的是,对于这个函数,errno不会被设置,只能通过返回值得到。


由posix_memalign( )获得的内存通过free( )释放。用法很简单:

 

由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);

 

以上的函数是ngnix项目中内存池分配得到的一个函数。将会使用。

 

更多文章 欢迎访问:http://blog.csdn.net/wallwind

抱歉!评论已关闭.