#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 /… .