『STLソース剖析』STL空間配置器
1383 ワード
スペースコンフィギュレータは、主にメモリ領域を申請し、メモリ領域を解放します.
コンフィギュレーションでは、16個のフリーチェーンテーブル「free_lis」が維持され、それぞれのメモリ領域ノードのサイズは8 bytesから128 bytesです.毎回1つのノードを使用するか、1つのノードを解放します.スペースが128 bytesより大きい場合は、コンフィギュレーションによってメンテナンスされるのではなく、mallocおよびallocを使用してシステムスタックにメモリスペースを申請(解放)します.申請とリリースのたびに、ノードの指向が絶えず切り替えられます.次のように、メモリ領域のコードとメモリ領域を解放するコードを申請します.
コンフィギュレーションでは、16個のフリーチェーンテーブル「free_lis」が維持され、それぞれのメモリ領域ノードのサイズは8 bytesから128 bytesです.毎回1つのノードを使用するか、1つのノードを解放します.スペースが128 bytesより大きい場合は、コンフィギュレーションによってメンテナンスされるのではなく、mallocおよびallocを使用してシステムスタックにメモリスペースを申請(解放)します.申請とリリースのたびに、ノードの指向が絶えず切り替えられます.次のように、メモリ領域のコードとメモリ領域を解放するコードを申請します.
static void * allocate(size_t n)
{
obj * __VOLATILE * my_free_list;
obj * __RESTRICT result;
if (n > (size_t) __MAX_BYTES) {
return(malloc_alloc::allocate(n));
}
//
my_free_list = free_list + FREELIST_INDEX(n);
result = *my_free_list;
if (result == 0) {
void *r = refill(ROUND_UP(n));
return r;
}
*my_free_list = result -> free_list_link;
//
return (result);
};
//
static void deallocate(void *p, size_t n)
{
obj *q = (obj *)p;
obj * __VOLATILE * my_free_list;
if (n > (size_t) __MAX_BYTES) {
malloc_alloc::deallocate(p, n);
return;
}
//
my_free_list = free_list + FREELIST_INDEX(n);
// ,
q -> free_list_link = *my_free_list;
*my_free_list = q;
}