|  | 
|      | 
|  | 
| ReferenceBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 3. Boost.Align
  
   | ||||||||||||
| ![[Tip]](/img/tip.png) | Tip | 
|---|---|
| Использование выровненного распределителя с минимальным значением выравнивания обычно подходит только для контейнеров, которые не основаны на узлах, таких как< | 
namespace boost { namespace alignment { template<class T, std::size_t Alignment = 1> class aligned_allocator; template<std::size_t Alignment> class aligned_allocator<void, Alignment>; template<class T1, class T2, std::size_t Alignment> bool operator==(const aligned_allocator<T1, Alignment>&, const aligned_allocator<T2, Alignment>&) noexcept; template<class T1, class T2, std::size_t Alignment> bool operator!=(const aligned_allocator<T1, Alignment>&, const aligned_allocator<T2, Alignment>&) noexcept; } }
template<class T, std::size_t Alignment = 1> class aligned_allocator { public: typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef void* void_pointer; typedef const void* const_void_pointer; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T& reference; typedef const T& const_reference; template<class U> struct rebind { typedef aligned_allocator<U, Alignment> other; }; aligned_allocator() = default; template<class U> aligned_allocator(const aligned_allocator<U, Alignment>&) noexcept; pointer address(reference value) const noexcept; const_pointer address(const_reference value) const noexcept; pointer allocate(size_type size, const_void_pointer = 0); void deallocate(pointer ptr, size_type); size_type max_size() const noexcept; template<class U, class... Args> void construct(U* ptr, Args&&... args); template<class U> void destroy(U* ptr); }; template<std::size_t Alignment> class aligned_allocator<void, Alignment> { public: typedef void value_type; typedef void* pointer; typedef const void* const_pointer; template<class U> struct rebind { typedef aligned_allocator<U, Alignment> other; }; };
За исключением деструктора, функции члена выровненного распределителя не должны вводить расы данных в результате одновременного вызова этих функций члена из разных потоков. Звонки в эти функции, которые распределяют или распределяют конкретную единицу хранения, должны происходить в одном общем порядке, и каждый такой вызов распределения должен происходить до следующего распределения (если таковое имеется) в этом порядке.
pointer address(reference value) const noexcept;
Возвращение:Фактический адрес объекта, на который ссылается<value>, даже при наличии перегруженного<operator&>.
const_pointer address(const_reference value) const noexcept;
Возвращение:Фактический адрес объекта, на который ссылается<value>, даже при наличии перегруженного<operator&>.
pointer allocate(size_type size, const_void_pointer = 0);
Возвращает:Указатель на начальный элемент массива хранения размера<n
       *sizeof(T)>, выровненный по максимуму минимального заданного выравнивания и выравнивания объектов типа<T>.
Замечание:Хранение производится по телефону<aligned_alloc(std::size_t,std::size_t)>.
Бросает:<std::bad_alloc>, если накопитель не может быть получен.
void deallocate(pointer ptr, size_type);
Требуется:<ptr>должно быть значение указателя, полученное из<allocate()>.
Эффекты:Выделяет хранилище, на которое ссылается<ptr>.
Использует<alignment::aligned_free(void*)>.
size_type max_size() const noexcept;
Возвращение:Самое большое значение<N>, для которого вызов<allocate(N)>может быть успешным.
template<class U, class... Args> void construct(U* ptr, Args&&... args);
Эффекты:<::new((void*)ptr)
       U(std::forward<Args>(args)...)>
template<class U> void destroy(U* ptr);
Эффекты:<ptr->~U()>
template<class T1, class T2, std::size_t Alignment> bool operator==(const aligned_allocator<T1, Alignment>&, const aligned_allocator<T2, Alignment>&) noexcept;
Возвращение:<true>.
template<class T1, class T2, std::size_t Alignment> bool operator!=(const aligned_allocator<T1, Alignment>&, const aligned_allocator<T2, Alignment>&) noexcept;
Возвращение:<false>.
Выровненный адаптер распределителя может превратить любой существующий распределитель C++03 или C++11 в тот, который поддерживает типы значений, которые чрезмерно выровнены. Он также позволяет указать минимальное значение выравнивания, используемое для всех распределений, с помощью дополнительного параметра шаблона. Адаптер аллокатора выравнивания еще не предусмотрен стандартом C++.
| ![[Tip]](/img/tip.png) | Tip | 
|---|---|
| Этот адаптер можно использовать с распределителем C++11, тип указателя которого является интеллектуальным указателем, но адаптер может выбирать только сырые типы указателей. | 
namespace boost { namespace alignment { template<class Allocator, std::size_t Alignment = 1> class aligned_allocator_adaptor; template<class A1, class A2, std::size_t Alignment> bool operator==(const aligned_allocator_adaptor<A1, Alignment>& a1, const aligned_allocator_adaptor<A2, Alignment>& a2) noexcept; template<class A1, class A2, std::size_t Alignment> bool operator!=(const aligned_allocator_adaptor<A1, Alignment>& a1, const aligned_allocator_adaptor<A2, Alignment>& a2) noexcept; } }
template<class Allocator, std::size_t Alignment = 1> class aligned_allocator_adaptor : public Allocator { typedef std::allocator_traits<Allocator> Traits; // exposition public: typedef typename Traits::value_type value_type; typedef typename Traits::size_type size_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef void* void_pointer; typedef const void* const_void_pointer; typedef std::ptrdiff_t difference_type; template<class U> struct rebind { typedef aligned_allocator_adaptor<typename Traits::template rebind_alloc<U>, Alignment> other; }; aligned_allocator_adaptor() = default; template<class A> explicit aligned_allocator_adaptor(A&& alloc) noexcept; template<class U> aligned_allocator_adaptor(const aligned_allocator_adaptor<U, Alignment>& other) noexcept; Allocator& base() noexcept; const Allocator& base() const noexcept; pointer allocate(size_type size); pointer allocate(size_type size, const_void_pointer hint); void deallocate(pointer ptr, size_type size); };
aligned_allocator_adaptor() = default;
Эффекты:Ценность инициализирует базовый класс<Allocator>.
template<class A> explicit aligned_allocator_adaptor(A&& alloc) noexcept;
Требуется:<Allocator>должен быть сконструирован из<A>.
Эффекты:Инициирует базовый класс<Allocator>с<std::forward<A>(alloc)>.
template<class U> aligned_allocator_adaptor(const aligned_allocator_adaptor<U, Alignment>& other) noexcept;
Требуется:<Allocator>должен быть сконструирован из<A>.
Эффекты:Инициирует базовый класс<Allocator>с<other.base()>.
Allocator& base() noexcept;
Возвращение:<static_cast<Allocator&>(*this)>
const Allocator& base() const noexcept;
Возвращение:<static_cast<constAllocator&>(*this)>
pointer allocate(size_type size);
Возвращает:Указатель на начальный элемент массива хранения размера<n
       *sizeof(value_type)>, выровненный по максимуму минимального заданного выравнивания и выравнивания объектов типа<value_type>.
Замечание:Хранилище получается путем вызова<A2::allocate>на объект<a2>, где<a2>типа<A2>является отскоком копии<base()>, где его<value_type>не указан.
Броски:Исключение выкидывает<A2::allocate>, если накопитель не может быть получен.
pointer allocate(size_type size, const_void_pointer hint);
Требуется:<hint>является значением, полученным путем вызова<allocate()>на любой эквивалентный выровненный объект адаптера распределителя, или же<nullptr>.
Возвращает:Указатель на начальный элемент массива хранения размера<n
       *sizeof(value_type)>, выровненный по максимуму минимального заданного выравнивания и выравнивания объектов типа<value_type>.
Замечание:Хранилище получается путем вызова<A2::allocate>на объект<a2>, где<a2>типа<A2>является отскоком копии<base()>, где его<value_type>не указан.
Броски:Исключение выкидывает<A2::allocate>, если накопитель не может быть получен.
void deallocate(pointer ptr, size_type size);
Требуется:
ptr>должно быть значение указателя, полученное из<allocate()>size>должно равняться стоимости, переданной в качестве первого аргумента для вызова<allocate()>, который вернулся<ptr>.Эффекты:Выделяет хранилище, на которое ссылается<ptr>.
Примечание:Использует<A2::deallocate>на объекте<a2>, где<a2>типа<A2>является отскоком<base()>, где его<value_type>не указан.
template<class A1, class A2, std::size_t Alignment> bool operator==(const aligned_allocator_adaptor<A1, Alignment>& a1, const aligned_allocator_adaptor<A2, Alignment>& a2) noexcept;
Возвращение:<a1.base()
       ==a2.base()>
template<class A1, class A2, std::size_t Alignment> bool operator!=(const aligned_allocator_adaptor<A1, Alignment>& a1, const aligned_allocator_adaptor<A2, Alignment>& a2) noexcept;
Возвращение:<!(a1==a2)>
Выровненный класс удаления - удобная утилита для уничтожения и последующего размещения построенных объектов, которые были выделены с использованием выровненной функции распределения, предоставленной в этой библиотеке. Он служит заменой классу<std::default_delete>для этого случая.
namespace boost { namespace alignment { class aligned_delete; } }
class aligned_delete { public: template<class T> void operator()(T* ptr) const noexcept(noexcept(ptr->~T())); };
template<class T> void operator()(T* ptr) const noexcept(noexcept(ptr->~T()));
Эффекты:Звонки<~T()>на<ptr>для уничтожения объекта, а затем вызовы<alignment::aligned_free>на<ptr>для освобождения выделенной памяти.
Примечание:Если<T>является неполным типом, программа плохо сформирована.
Черта типа выравнивания используется для запроса требования выравнивания типа во время компиляции. Он предоставляется стандартной библиотекой C++11, но предоставляется в этой библиотеке для реализаций C++11 и C++03, которые не обеспечивают эту функциональность.
namespace boost { namespace alignment { template<class T> struct alignment_of; template<class T> constexpr std::size_t alignment_of_v = alignment_of<T>::value; } }
template<class T> struct alignment_of;
Значение:Требование выравнивания типа<T>как интегральной постоянной типа<std::size_t>. Если<T>является типом эталонного массива, то значение должно быть выравниванием этого типа. Если<T>является типом решетки, то значение должно соответствовать типу элемента.
Требуется:<T>должен быть полный тип объекта, или его массив, или ссылка на один из этих типов.
Макроподсказка выравнивания может использоваться для информирования компилятора о выравнивании блока памяти, для обеспечения векторизации или других оптимизаций, связанных с конкретным выравниванием компилятора.
BOOST_ALIGN_ASSUME_ALIGNED(ptr, alignment)
BOOST_ALIGN_ASSUME_ALIGNED(ptr, alignment)
Требуется:
alignment>будет власть двухptr>должен быть мутируемымЭффект:<ptr>может быть изменен конкретным способом реализации для информирования компилятора о его выравнивании.
Функция проверки выравнивания указывает, является ли адрес кратным указанному значению выравнивания. Как правило, в утверждениях полезно проверить, правильно ли выровнена память. Данная функциональность пока не предусмотрена стандартом C++.
namespace boost { namespace alignment { constexpr bool is_aligned(std::size_t value, std::size_t alignment) noexcept; bool is_aligned(const void* ptr, std::size_t alignment) noexcept; } }
bool is_aligned(const void* ptr, std::size_t alignment) noexcept;
Требует:<alignment>должна быть сила двух.
Возврат:<true>, если значение<ptr>выровнено по границе, указанной<alignment>, в противном случае<false>.
Статья Reference раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 3. Boost.Align может быть полезна для разработчиков на c++ и boost.
:: Главная :: Chapter 3. Boost.Align ::
| реклама |