Какой распределитель по умолчанию GCC использует для STL?

#c #gcc

#c #gcc

Вопрос:

Согласно этой ссылке, gcc предоставляет множество интересных распределителей памяти для использования с контейнерами STL, но какой используется по умолчанию, если я не укажу его при создании std::list?

Комментарии:

1. Я полагаю, что компилятор ничего не делает с распределителями памяти; Я ожидаю, что он оставляет все выделение памяти компоновщику / загрузчику и среде выполнения libc и libstdc библиотекам.

Ответ №1:

Как сказано на той странице, на которую вы ссылаетесь,

Текущий выбор по умолчанию для распределителя — __gnu_cxx::new_allocator.

Т.е. распределитель по умолчанию в основном просто operator new .

Комментарии:

1. На самом деле это зависит от параметра, который может быть передан скрипту настройки GCC (—enable-libstdcxx-allocator), поэтому ваш ответ не обязательно верен.

Ответ №2:

Согласно wiki:«Распределитель по умолчанию использует operator new для выделения памяти.[13] Это часто реализуется в виде тонкого слоя вокруг функций выделения кучи C, [14] которые обычно оптимизированы для нечастого выделения больших блоков памяти»

из «ISO / IEC (2003). ISO/IEC 14882:2003 (E): Языки программирования — C » (ссылка вики)

Распределитель по умолчанию:

 namespace std {   
  template <class T> class allocator;  
  // specialize for void: template <> class allocator<void>   
  {  
   public:  
   typedef void*    pointer;   
   typedef const void* const_pointer;
   // reference-to-void members are impossible. typedef void value_type;  
   template <class U> struct rebind  {  typedef allocator<U> other;  };  
};


template <class T> class allocator  
{  
public:  
  typedef size_t size_type;  
  typedef ptrdiff_t difference_type;  
  typedef T* pointer;  
  typedef const T* const_pointer;  
  typedef Tamp; reference;  
  typedef const Tamp; const_reference;  
  typedef T template value_type;  
  template <class U> struct rebind { typedef allocator<U> other;   
}; 

  allocator() throw();  
  allocator(const allocatoramp;) throw();  
  template <class U> allocator(const allocator<U>amp;) throw();  
  ̃allocator() throw();
   pointer address(reference x) const;      
  const_pointer address(const_reference x) const;`    

  pointer allocate(  
     size_type, allocator<void>::const_pointer hint = 0);  
     void deallocate(pointer p, size_type n);  
     size_type max_size() const throw();  
     void construct(pointer p, const Tamp; val);  
     void destroy(pointer p);  
     };  
}
  

Комментарии:

1. Я думаю, поскольку вопрос конкретно касается gcc , и поскольку ваш ответ дан в терминах стандарта, он не совсем отвечает на вопрос.

2. Только что проверил исходный код распределителя libstdc (стандартная библиотека GNU C v3), он соответствует упомянутому стандарту. можете взглянуть на это gcc.gnu.org/onlinedocs/libstdc /libstdc -html-USERS-3.4 /… .