Spec-Zone .ru
спецификации, руководства, описания, API
ADC домой > Ссылочная библиотека> Ссылка> Дарвин> Разное пространство пользователя ссылка API

 


stl_alloc.h

Включает:

Введение

Это - внутренний заголовочный файл, включенный другими заголовками библиотеки. Вы не должны пытаться использовать его непосредственно.



Классы

__ debug_alloc
__ default_alloc_template
__ malloc_alloc_template
__ new_alloc
__ simple_alloc
средство выделения


Функции

оператор ==

оператор ==


template<int inst> inline bool operator==(
    const __malloc_alloc_template<inst>&, 
    const __malloc_alloc_template<inst>&) 
Обсуждение

Операторы сравнения для всех средств выделения SGI-стиля predifined. Это гарантирует, что __ средство выделения (например), будет работать правильно. Как требуется все средства выделения выдерживают сравнение равный.

Определения типов


_Alloc_traits


// The fully general version. 
template<typename _Tp, typename _Allocator> struct _Alloc_traits { 
    static const bool _S_instanceless = false; 
    typedef typename _Allocator::template rebind<_Tp>::other allocator_type; 
};  
Обсуждение

@if maint Другой адаптер средства выделения: _Alloc_traits. Это служит двум целям. Во-первых, позвольте записать контейнеры, которые могут использовать или средства выделения стиля «SGI» или «стандартные» средства выделения. Во-вторых, обеспечьте механизм так, чтобы контейнеры могли запросить, имеет ли средство выделения отличные экземпляры. В противном случае контейнер может избежать тратить впустую слово памяти, чтобы хранить пустой объект. Для примеров использования см. stl_vector.h, и т.д., или любой из других классов, полученных от этого.

Этот адаптер использует частичную специализацию. Общий случай _Alloc_traits<_Tp, _Alloc> предполагает, что _Alloc является приспосабливающим стандарту средством выделения, возможно с неравными экземплярами и нестатическими элементами. (Это все еще ведет себя правильно, даже если _Alloc имеет статический элемент и если все экземпляры равны. Улучшения влияют на производительность, не правильность.)

Всегда существует два элемента: allocator_type, который является стандартом - соответствующий тип средства выделения для выделения объектов типа _Tp, и _S_instanceless, статический элемент константы типа bool. Если _S_instanceless является истиной, это означает, что нет никакого различия ни между какими двумя экземплярами типа allocator_type. Кроме того, если _S_instanceless является истиной, то _Alloc_traits имеет один дополнительный элемент: _Alloc_type. Этот тип инкапсулирует выделение и освобождение объектов типа _Tp через статический интерфейс; это имеет две функции членства, подписи которых

- статические _Tp* выделяют (size_t) - статичный недействительный, освобождают (_Tp*, size_t)

size_t параметры являются «стандартным» стилем (см. вершину stl_alloc.h), в котором они берут количества, не размеры.

@endif (См. информацию средств выделения @endlink для больше.)

Структуры и объединения


__ средство выделения


template<typename _Tp, typename _Alloc> struct __allocator { 
    _Alloc __underlying_alloc;  
    typedef size_t size_type; 
    typedef ptrdiff_t difference_type; 
    typedef _Tp*pointer; 
    typedef const _Tp*const_pointer; 
    typedef _Tp& reference; 
    typedef const _Tp& const_reference; 
    typedef _Tp value_type;  
    template<typename _Tp1> struct rebind {
        typedef __allocator<_Tp1, _Alloc> other;
        };  
    __allocator() throw() {
        } __allocator(
        const __allocator& __a) throw() : __underlying_alloc(__a.__underlying_alloc) {
        }  template<typename _Tp1> __allocator(
        const __allocator<_Tp1, _Alloc>& __a) throw() : __underlying_alloc(__a.__underlying_alloc) {
        }  ~__allocator() throw() {
        }  pointer address(
        reference __x) const {
        return &__x;
        }  const_pointer address(
        const_reference __x) const {
        return &__x;
        }  // NB: __n is permitted to be 0. The C++ standard says nothing 
    // about what the return value is when __n == 0. 
    _Tp* allocate(size_type __n, const void* = 0) { 
        _Tp* __ret = 0; 
        if (
            __n) __ret = static_cast<_Tp*>(
            _Alloc::allocate(
                __n * sizeof(
                    _Tp))); 
        return __ret; 
        }  // __p is not permitted to be a null pointer. 
    void deallocate(pointer __p, size_type __n) {
        __underlying_alloc.deallocate(
            __p,
            __n * sizeof(
                _Tp));
        }  size_type max_size() const throw() {
        return size_t(
            -1) / sizeof(
            _Tp);
        }  void construct(pointer __p, const _Tp& __val) {
        new(
            __p) _Tp(
            __val);
        }  void destroy(pointer __p) {
        __p->~_Tp();
        } 
};  
Обсуждение

@if maint адаптер Средства выделения для превращения «SGI» разрабатывают средство выделения (например, __ выделение, __ malloc_alloc_template) в «стандартное» средство выделения приспосабливания. Обратите внимание на то, что этот адаптер делает *не*, предполагают, что все объекты базового класса выделения идентичны, и при этом это не предполагает, что все функции членства базового выделения являются статическими функциями членства. Отметьте, также, что __ средство выделения<_Tp, __alloc> является по существу той же вещью как средство выделения<_Tp>. @endif (См. информацию средств выделения @endlink для больше.)

Последнее обновление: 20.06.2006