“...世界上最受推崇、设计最精良的 C++ 库项目之一。” — Herb Sutter 和 Andrei Alexandrescu, C++ Coding Standards
void* align(std::size_t alignment, std::size_t size, void*& ptr, std::size_t& space);
#include <boost/align/align.hpp>
如果能够将由 ptr
指向、长度为 space
的缓冲区中,分配 size
字节、以 alignment
对齐的存储空间,则函数会将 ptr
更新为指向该存储空间的第一个可能地址,并将 space
减去用于对齐所占用的字节数。否则,函数不做任何操作。
alignment
必须是 2 的幂。ptr
必须指向至少 space
字节的连续存储空间。ptr
值。该函数会更新其 ptr
和 space
参数,以便可以使用不同的 alignment
和 size
参数对同一缓冲区重复调用。
template<class T> constexpr T align_up(T value, std::size_t alignment) noexcept;
#include <boost/align/align_up.hpp>
T
不能是指针类型。
alignment
必须是 2 的幂。
大于或等于 value
且是 alignment
的倍数的某个值。
template<class T> constexpr T align_down(T value, std::size_t alignment) noexcept;
#include <boost/align/align_down.hpp>
T
不能是指针类型。
alignment
必须是 2 的幂。
小于或等于 value
且是 alignment
的倍数的某个值。
void* aligned_alloc(std::size_t alignment, std::size_t size);
#include <boost/align/aligned_alloc.hpp>
分配一个对象的空间,其对齐方式由 alignment
指定,大小由 size
指定,且其值是不确定的。
alignment
必须是 2 的幂。
返回空指针或指向已分配空间的指针。
在某些平台上,分配的空间可能比 size
字节略大,以允许对齐。
void aligned_free(void* ptr);
#include <boost/align/aligned_alloc.hpp>
释放 ptr
所指向的空间,使其可用于后续分配。如果 ptr
是空指针,则不执行任何操作。否则,如果该参数不匹配之前由 aligned_alloc()
函数返回的指针,或者该空间已被 aligned_free()
调用释放,则行为是未定义的。
ptr
是空指针或之前由 aligned_alloc()
函数返回但尚未被 aligned_free()
调用释放的指针。
函数 aligned_free()
不返回值。
bool is_aligned(const volatile void* ptr, std::size_t alignment) noexcept;
#include <boost/align/is_aligned.hpp>
alignment
必须是 2 的幂。
如果 ptr
按 alignment
指定的边界对齐,则返回 true
,否则返回 false
。
template<class T> constexpr bool is_aligned(T value, std::size_t alignment) noexcept;
#include <boost/align/is_aligned.hpp>
T
不能是指针类型。
alignment
必须是 2 的幂。
如果 value
的值按 alignment
指定的边界对齐,则返回 true
,否则返回 false
。
template<class T, std::size_t Alignment = 1> class aligned_allocator;
#include <boost/align/aligned_allocator.hpp>
通常,仅当容器不是基于节点的(例如 vector
)时,使用具有最小 Alignment
值的对齐分配器才有用。对于基于节点的容器(例如 list
),节点对象将具有最小对齐,而不是值类型对象。
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef void* void_pointer;
typedef const void* const_void_pointer;
typedef std::add_lvalue_reference_t<T> reference;
typedef std::add_lvalue_reference_t<const T> const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef std::true_type propagate_on_container_move_assignment;
typedef std::true_type is_always_equal;
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 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
引用的存储空间。
使用 aligned_free(void*)
。
size_type max_size() const noexcept;
调用 allocate(N)
可能成功所允许的最大 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
template<class Allocator, std::size_t Alignment = 1> class aligned_allocator_adaptor;
#include <boost/align/aligned_allocator_adaptor.hpp>
此适配器可与指针类型为智能指针的 C++11 分配器一起使用,但适配器可以选择仅公开原始指针类型。
typedef typename Allocator::value_type value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef void* void_pointer;
typedef const void* const_void_pointer;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
template<class U> struct rebind { typedef aligned_allocator_adaptor<typename std::allocator_traits<Allocator>::template rebind_alloc<U>, Alignment> other; };
aligned_allocator_adaptor() = default;
对 Allocator
基类进行值初始化。
template<class A> aligned_allocator_adaptor(A&& alloc) noexcept;
Allocator
必须可以从 A
构建。
使用 std::forward<A>(alloc)
初始化 Allocator
基类。
template<class U> aligned_allocator_adaptor(const aligned_allocator_adaptor<U, Alignment>& other) noexcept;
Allocator
必须可以从 A
构建。
使用 other.base()
初始化 Allocator
基类。
Allocator& base() noexcept;
static_cast<Allocator&>(*this)
const Allocator& base() const noexcept;
static_cast<const Allocator&>(*this)
pointer allocate(size_type size);
指向一个大小为 n * sizeof(value_type)
的数组存储的第一个元素的指针,该存储空间在指定的最小对齐和类型 value_type
的对象的对齐中取最大值进行对齐。
存储空间通过在对象 a2
上调用 A2::allocate()
来获取,其中 A2
是 base()
的一个重新绑定副本,且其 value_type
是实现定义的。
如果存储空间无法获得,则抛出从 A2::allocate()
抛出的异常。
pointer allocate(size_type size, const_void_pointer hint);
hint
是通过在任何等效的分配器对象上调用 allocate()
获取的值,否则为 null 指针。
指向一个大小为 n * sizeof(value_type)
的数组存储的第一个元素的指针,该存储空间在指定的最小对齐和类型 value_type
的对象的对齐中取最大值进行对齐。
存储空间通过在对象 a2
上调用 A2::allocate()
来获取,其中 A2
是 base()
的一个重新绑定副本,且其 value_type
是实现定义的。
如果存储空间无法获得,则抛出从 A2::allocate()
抛出的异常。
void deallocate(pointer ptr, size_type size);
ptr
必须是通过 allocate()
获取的指针值。size
必须等于调用 allocate()
时传递给它的第一个参数值,该调用返回了 ptr
。ptr
引用的存储空间。在对象 a2
上调用 A2::deallocate()
,其中 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)
class aligned_delete;
#include <boost/align/aligned_delete.hpp>
template<class T> void operator()(T* ptr) noexcept(noexcept(ptr->~T()));
调用 ~T()
在 ptr
上销毁对象,然后调用 aligned_free()
在 ptr
上释放已分配的内存。
如果 T
是不完整类型,则程序是格式错误的。
template<class T> struct alignment_of;
#include <boost/align/alignment_of.hpp>
类型 T
的对齐要求,表示为一个类型为 std::size_t
的整数常量。当 T
是引用数组类型时,其值应为被引用类型的对齐。当 T
是数组类型时,其值应为元素类型的对齐。
T
必须是完整对象类型,或其数组,或这些类型的引用。
BOOST_ALIGN_ASSUME_ALIGNED(ptr, alignment)
#include <boost/align/assume_aligned.hpp>
alignment
必须是 2 的幂。ptr
必须是可修改的。ptr
可以根据实现定义的方式进行修改,以告知编译器其对齐方式。