Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

make_shared and allocate_shared for arrays

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

make_shared and allocate_shared for arrays

Введение
Синопсис
Общие требования
Свободные функции
История
Ссылки

Introduction

Первоначально шаблоны функций Boostmake_sharedиallocation_sharedбыли предназначены только для эффективного распределения общих объектов. Необходимо обеспечить эффективное распределение общих массивов. Одна критика шаблона классаshared_arrayвсегда заключалась в отсутствии утилиты make_shared, которая обеспечивает только одно распределение.

Файлы заголовкаипредоставляют шаблоны функций, перегрузкиmake_sharedивыделяют_sharedдля типов массивов, чтобы удовлетворить эту потребность.make_sharedиспользует глобального оператораnewдля выделения памяти, тогда какallocate_sharedиспользует выделенный пользователем распределитель, позволяющий более точно контролировать.

Synopsis

namespace boost {
    template<class U> // U is T[]
    shared_ptr<U> make_shared(size_t size);
    template<class U, class A> // U is T[]
    shared_ptr<U> allocate_shared(const A& allocator, size_t size);
    template<class U> // U is T[N]
    shared_ptr<U> make_shared();
    template<class U, class A> // U is T[N]
    shared_ptr<U> allocate_shared(const A& allocator);
    template<class U> // U is T[]
    shared_ptr<U> make_shared(size_t size, const T& value);
    template<class U, class A>  // U is T[]
    shared_ptr<U> allocate_shared(const A& allocator, size_t size, const T& value);
    template<class U> // U is T[N]
    shared_ptr<U> make_shared(const T& value);
    template<class U, class A> // U is T[N]
    shared_ptr<U> allocate_shared(const A& allocator, const T& value);
    template<class U> // U is T[]
    shared_ptr<U> make_shared_noinit(size_t size);
    template<class U, class A> // U is T[]
    shared_ptr<U> allocate_shared_noinit(const A& allocator, size_t size);
    template<class U> // U is T[N]
    shared_ptr<U> make_shared_noinit();
    template<class U, class A> // U is T[N]
    shared_ptr<U> allocate_shared_noinit(const A& allocator);
}

Common Requirements

template<class U>
    shared_ptr<U> make_shared(args);
template<class U, class A>
    shared_ptr<U> allocate_shared(const A& allocator, args);
template<class U>
    shared_ptr<U> make_shared_noinit(args);
template<class U, class A>
    shared_ptr<U> allocate_shared_noinit(const A& allocator, args);

Требуется:Uимеет формуTилиT[N].Aдолжен бытьРаспределителем, как описано в разделе 17.6.3.5Требования к Распределителям] Стандарта C++. Конструктор и разрушитель копийАне должны делать исключений.

Эффекты:Выделяет память для объекта типаU(илиT [размер], когдаUявляетсяT, гдеразмеропределяется изargs, как указано конкретной перегрузкой. Объект инициализируется в соответствии с конкретной перегрузкой. Шаблонывыделяют_sharedивыделяют_shared_noinitиспользуют копиюраспределителядля выделения памяти. Если бросается исключение, функции не имеют эффекта.

Возвращает:Ashared_ptrэкземпляр, который хранит и владеет адресом вновь построенного объекта.

Пост-условия:r.get()! 0 && r.use_count() == 1, гдеrявляется обратным значением.

Броски:bad_alloc, исключение, брошенное изA::allocate, или из инициализации объекта.

Замечания:

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

Если объект типа массиваTуказан для инициализации до значения одного и того же типазначения, это должно толковаться как означающее, что каждый элемент массива объекта инициализирован до соответствующего элемента отзначения.

Если объект типа массива указан как инициализируемый по значению, это должно толковаться как означающее, что каждый элемент массива объекта инициализирован по значению.

Элементы массива инициализируются в порядке возрастания их адресов.

Если субобъект немассивного типаTуказан для инициализации в значениезначение,make_sharedдолжен выполнить эту инициализацию посредством выражения::new(ptr) T(value), гдеptrимеет типпустоту*и указывает на хранилище, пригодное для хранения объекта типаT.

Когда субобъект немассивного типаTуказывается для инициализации к значениюзначение,выделение_разделенноедолжно выполнять эту инициализацию посредством выраженияallocator_traits::construct(a2, ptr, значение), гдеptrуказывает на хранение, подходящее для удержания объекта типаTиa2типа A2 является отскоком копии распределителяраспределителя, переданнойвыделению_sharedтаким образом, что егозначение_типявляетсяT.

Когда субобъект немассивного типаTопределен как инициализированный по значению,make_sharedдолжен выполнить эту инициализацию посредством выражения::new(ptr) T(), гдеptrимеет видvoid*и указывает на хранилище, пригодное для удержания объекта типаT.

Когда субобъект немассивного типаTопределен как инициализированный по значению,allocate_sharedдолжен выполнить эту инициализацию посредством выраженияallocator_traits::construct(a2, ptr), гдеptrуказывает на хранилище, пригодное для хранения объекта типаTиa2типа A2 является отскоком копии распределителяallocator, переданнойallocate_sharedтаким образом, что егоvalue_typeявляетсяT.

Когда субобъект немассивного типаTопределен как инициализированный по умолчанию,make_shared_noinitиallocate_shared_noinitдолжен выполнить эту инициализацию посредством выражения::new(ptr) T, гдеptrимеет видvoid*и указывает на хранилище, пригодное для удержания объекта типаT.

Когда срок службы объекта, управляемого обратным значением, заканчивается или когда инициализация элемента массива бросает исключение, инициализированные элементы должны быть уничтожены в обратном порядке их построения.

Примечания:Эти функции обычно выделяют больше памяти, чемразмер (U), чтобы обеспечить внутренние структуры бухгалтерского учета, такие как количество ссылок.

Free Functions

template<class U> 
    shared_ptr<U> make_shared(size_t size);
template<class U, class A> 
    shared_ptr<U> allocate_shared(const A& allocator, size_t size);

Возвращает:Ashared_ptrк объекту типаT[size]с инициализацией значения.

Замечания:Эти перегрузки должны принимать участие в разрешении перегрузки только тогда, когдаUимеет формуT.

Примеры:

boost::shared_ptr<int[]> a1 = boost::make_shared<int[]>(size);
boost::shared_ptr<int[][2]> a2 = boost::make_shared<int[][2]>(size);
template<class U> 
    shared_ptr<U> make_shared();
template<class U, class A> 
    shared_ptr<U> allocate_shared(const A& allocator);

Возврат:Ashared_ptrобъекту типа с инициализацией значенийT[N].

Замечания:Эти перегрузки должны участвовать в разрешении перегрузки только тогда, когдаUимеет формуT [N].

Примеры:

boost::shared_ptr<int[8]> a1 = boost::make_shared<int[8]>();
boost::shared_ptr<int[4][2]> a2 = boost::make_shared<int[4][2]>();
template<class U> 
    shared_ptr<U> make_shared(size_t size, const T& value);
template<class U, class A> 
    shared_ptr<U> allocate_shared(const A& allocator, size_t size, const T& value);

Возвращает:Ashared_ptrобъекту типаT[размер], где каждый элемент массива типаTинициализируется дозначения.

Замечания:Эти перегрузки должны принимать участие в разрешении перегрузки только тогда, когдаUимеет формуT.

Примеры:

boost::shared_ptr<int[]> a1 = boost::make_shared<int[]>(size, 1);
boost::shared_ptr<int[][2]> a2 = boost::make_shared<int[][2]>(size, {1, 2});
template<class U> 
    shared_ptr<U> make_shared(const T& value);
template<class U, class A> 
    shared_ptr<U> allocate_shared(const A& allocator, const T& value);

Возвращает:Ashared_ptrобъекту типаT[N], где каждый элемент массива типаTинициализируется дозначения.

Замечания:Эти перегрузки должны участвовать в разрешении перегрузки только тогда, когдаUимеет формуT [N].

Примеры:

boost::shared_ptr<int[8]> a1 = boost::make_shared<int[8]>(1);
boost::shared_ptr<int[4][2]> a2 = boost::make_shared<int[4][2]>({1, 2});
template<class U> 
    shared_ptr<U> make_shared_noinit(size_t size);
template<class U, class A> 
    shared_ptr<U> allocate_shared_noinit(const A& allocator, size_t size);

Возвращает:Ashared_ptrобъекту типаT [размер]по умолчанию.

Замечания:Эти перегрузки должны принимать участие в разрешении перегрузки только тогда, когдаUимеет формуT.

Примеры:

boost::shared_ptr<int[]> a1 = boost::make_shared_noinit<int[]>(size);
boost::shared_ptr<int[][2]> a2 = boost::make_shared_noinit<int[][2]>(size);
template<class U> 
    shared_ptr<U> make_shared_noinit();
template<class U, class A> 
    shared_ptr<U> allocate_shared_noinit(const A& allocator);

Возвращает:Ashared_ptrобъекту типаT[N]по умолчанию.

Замечания:Эти перегрузки должны участвовать в разрешении перегрузки только тогда, когдаUимеет формуT [N].

Примеры:

boost::shared_ptr<int[8]> a1 = boost::make_shared_noinit<int[8]>();
boost::shared_ptr<int[4][2]> a2 = boost::make_shared_noinit<int[4][2]>();

History

Февраль 2014. Глен Фернандес обновил перегрузки make_shared и allocation_shared, чтобы соответствовать спецификации в стандартной бумаге C++N3870, включая разрешение отчета о дефекте стандартной библиотеки C++ 2070 и сокращение пространственных накладных расходов внутренних структур бухгалтерского учета.

Ноябрь 2012. Глен Фернандес внес вклад в реализацию make_shared и allocation_shared для массивов.

References

N3870,Extending make_shared to Support Arrays, Revision 1, Peter Dimov & Glen Fernandes, January, 2014.


$Date$

<маленький>Копирайт 2012-2014 Глен Фернандес. Распределенные под Boost Software License, Version 1.0. Сопутствующий файл LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.[ORIG_END] -->

Статья make_shared and allocate_shared for arrays раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:25:47/0.01487922668457/1