『STLソース剖析』STL空間配置器

1383 ワード

スペースコンフィギュレータは、主にメモリ領域を申請し、メモリ領域を解放します.
コンフィギュレーションでは、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;
  }