1.x264的内存分配
“上下文”即context的概念常见于c语言的代码工程中。一般它就是最大、最复杂的一个结构体,里面包含着很多信息,一般也会占据着巨大的内存占用量。如果很多成员指针都占有内存,而这些内存还都不是特别大,那就会导致大量的内存碎片。x264减少内存碎片的思想比较简单,就是申请一大块内存,然后逐个分割。释放的时候也是将整块大内存释放掉。但是具体方法比较巧妙。
2.代码实现
主要代码就是几个宏。研究清楚这几个宏,就明白了x264的内存管理方法。
#define PREALLOC_INIT\
int prealloc_idx = 0;\
int64_t prealloc_size = 0;\
uint8_t **preallocs[PREALLOC_BUF_SIZE];
下面:
#define PREALLOC( var, size )\
do {\
preallocs[prealloc_idx++] = (uint8_t**)&var;\
prealloc_size += ALIGN((int64_t)(size), NATIVE_ALIGN);\
} while( 0 )
第三个:
#define PREALLOC_END( ptr )\
do {\
/*一把分配 prealloc_size 这么多 (prealloc_size) 内存, 这是零散要的总量了*/
CHECKED_MALLOC( ptr, prealloc_size );\
while( prealloc_idx-- )\
*preallocs[prealloc_idx] = (uint8_t*)((intptr_t)(*preallocs[prealloc_idx]) + (intptr_t)ptr);\
} while( 0 )
然后看代码的frame_new() 函数,就能明白这其中的内存分配妙处了。当然,使用到这三个宏的地方不止这一个函数。用法和思想都是一样的。