ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boost::pool_allocator와 boost::fast_pool_allocator의 차이
    프로그래밍/c++ 2016. 2. 28. 08:23
    반응형

    boost 1.6 버전 기준이다.


    boost::pool_allocator는 정렬된 할당/해제를 사용하는 반면,


    boost::fast_pool_allocator는 정렬되거나 정렬되지 않은 할당/ 정렬되지 않은 해제를 사용한다.


    정렬되지 않은 할당/해제는 메모리 노드의 끝 부분에 메모리를 하나 추가하면 그만이지만,

    정렬된 할당/해제의 경우 이전 메모리를 찾는 과정이 필요하고 이 부분에서 부하가 생길 수 있다.

    다만 정렬된 할당/해제의 경우 연속된 메모리(가변, new int[10]과 같은!)를 지원하기 때문에 사용처에 따라 잘 구분을 해야할 것이다.



    boost::pool_allocator의 allocate / deallocate


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // pool allocator
     
        static pointer allocate(const size_type n)
        {
          const pointer ret = static_cast<pointer>(
              singleton_pool<pool_allocator_tag, sizeof(T), UserAllocator, Mutex,
                  NextSize, MaxSize>::ordered_malloc(n) );
     
          if ((ret == 0) && n)
            boost::throw_exception(std::bad_alloc());
     
          return ret;
        }
     
        static void deallocate(const pointer ptr, const size_type n)
        {  
          singleton_pool<pool_allocator_tag, sizeof(T), UserAllocator, Mutex,
              NextSize, MaxSize>::ordered_free(ptr, n);
        }
     
     
    // 할당에는 ordered_malloc을
     
    // 해제에는 ordered_free를
    cs



    boost::fast_pool_allocator의 allocate / deallocate


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // fast pool allocator
     
        static pointer allocate(const size_type n)
        {
          const pointer ret = (n == 1) ?
              static_cast<pointer>(
                  (singleton_pool<fast_pool_allocator_tag, sizeof(T),
                      UserAllocator, Mutex, NextSize, MaxSize>::malloc)() ) :
              static_cast<pointer>(
                  singleton_pool<fast_pool_allocator_tag, sizeof(T),
                      UserAllocator, Mutex, NextSize, MaxSize>::ordered_malloc(n) );
          if (ret == 0)
            boost::throw_exception(std::bad_alloc());
          return ret;
        }
     
        static void deallocate(const pointer ptr, const size_type n)
        { //! Deallocate memory.
          if (n == 1)
            (singleton_pool<fast_pool_allocator_tag, sizeof(T),
                UserAllocator, Mutex, NextSize, MaxSize>::free)(ptr);
          else
            (singleton_pool<fast_pool_allocator_tag, sizeof(T),
                UserAllocator, Mutex, NextSize, MaxSize>::free)(ptr, n);
        }
     
    // 1개 할당에는 malloc을 n개 할당에는 ordered_malloc을(단, 1 < n)
    // 해제엔 항상 free를
    cs



    결론


    pool_allocator는 vector와 같이 연속된 메모리를 사용할 때 적합.

    fast_pool_allocator는 list, map, set과 같은 연속된 메모리를 사용하는 자료구조가 아닐 때 적합.

    반응형
Designed by Tistory.