void *x264_malloc( int i_size )解析 (2011-05-04 14:28:18)
1 将申请的内存地址调整到16的倍数;
2 将调整前的地址和长度放在 调整后地址的前面8个字节中,便于释放内存;
- void *x264_malloc( int i_size )
- {
- #ifdef SYS_MACOSX
-
- return malloc( i_size );
- #elif defined( HAVE_MALLOC_H )
- return memalign( 16, i_size );
- #else
- uint8_t * buf;
- uint8_t * align_buf;
- buf = (uint8_t *) malloc( i_size + 15 + sizeof( void ** ) +
- sizeof( int ) );
- align_buf = buf + 15 + sizeof( void ** ) + sizeof( int );
- align_buf -= (long) align_buf & 15;
- *( (void **) ( align_buf - sizeof( void ** ) ) ) = buf;
- *( (int *) ( align_buf - sizeof( void ** ) - sizeof( int ) ) ) = i_size;
- return align_buf;
- #endif
- }
复制代码
做移植时刚好看到这一段,开始也搞不明白。后来查了一,这其中有两个关键点: 1是二级指针的使用,二级指针可以看成是一个一维的指针数组。 2是内存管理思想。 下面具体分析一下: 这段代码主要是为了实现:返回一个16字节对齐的 i_size 大小的内存;同时再分配该内存时添加了一些额外信息在所分配的内存的头部。- buf = (uint8_t *) malloc( i_size + 15 + sizeof( void ** ) +sizeof( int ) );
复制代码 上面的代码中15 + sizeof( void ** ) +sizeof( int ) 是为了字节对齐以及放置所分配的内存块的额外添加的信息的。- align_buf -= (long) align_buf & 15;
复制代码 这里实现字节对齐- *( (void **) ( align_buf - sizeof( void ** ) ) ) = buf;
复制代码 这里 先获取 指针align_buf 前面一个二级指针的大小位置的指针,然后把该指针转换为二级指针(这里就是要使用二级指针可以等同为一维的指针数组的用法),再在转换后的二级指针前面加一个 * 运算符其实就是取该一维指针数组的第一个元素,该元素被赋值为 buf,也就是真正分配内存块的首指针。- *( (int *) ( align_buf - sizeof( void ** ) - sizeof( int ) ) ) = i_size;
复制代码 这里则是,获取指针align_buf前面 sizeof( void ** ) + sizeof( int ) 位置的指针,并转换为int型,然后取该指针的值并赋值为 i_size。也就是保存用户需求的内存块的大小,这个其实就是内存管理的思想的一点小体现。
下面再说一下,内存的释放:- void H264_free( void *p )
- {
- if( p )
- {
- #if defined( HAVE_MALLOC_H ) || defined( SYS_MACOSX )
- free( p );
- #else
- free( *( ( ( void **) p ) - 1 ) );
- #endif
- }
- }
复制代码 按照上面的分析,指针p其实就是指针align_buf。经过上面的分析应该很容易就知道
*( ( ( void **) p ) - 1 ) 这里得到的其实就是上面的 buf 指针。可见释放是不会造成内存泄露的。
经过这么分析,感到,c语言的指针真的非常强大!!!! |
阅读(2903) | 评论(1) | 转发(0) |