# Alignment Manipulation

## Aligned Memory Allocator

template<class T, size_t Align = std::conditional<std::is_same<unsupported, default_arch>::value, common, default_arch>::type::alignment()>
class aligned_allocator

  Allocator for aligned memory.

  The aligned_allocator class template is an allocator that performs memory allocation aligned by the specified value.

  Template Parameters:

    - T – type of objects to allocate.

    - Align – alignment in bytes.

  Public Functions

  inline aligned_allocator() noexcept

    Default constructor.

  inline aligned_allocator(const aligned_allocator &rhs) noexcept

    Copy constructor.

  inline ~aligned_allocator()

    Destructor.

  inline pointer allocate(size_type n, const void *hint = 0)

    Allocates `n * sizeof(T)` bytes of uninitialized memory, aligned by `A`.

    The alignment may require some extra memory allocation.

    Parameters:

      - n – the number of objects to allocate storage for.

      - hint – unused parameter provided for standard compliance.

    Returns:

      a pointer to the first byte of a memory block suitably aligned and sufficient to hold an array of `n` objects of type `T`.

  inline void deallocate(pointer p, size_type n)

    Deallocates the storage referenced by the pointer p, which must be a pointer obtained by an earlier call to allocate().

    The argument `n` must be equal to the first argument of the call to allocate() that originally produced `p`; otherwise, the behavior is undefined.

    Parameters:

      - p – pointer obtained from allocate().

      - n – number of objects earlier passed to allocate().

  inline size_type max_size() const noexcept

    Returns the maximum theoretically possible value of `n`, for which the call allocate(n, 0) could succeed.

    Returns:

      the maximum supported allocated size.

  inline size_type size_max() const noexcept

    This method is deprecated, use max_size() instead.

  template<class U, class ...Args>
  inline void construct(U *p, Args&&... args)

    Constructs an object of type `T` in allocated uninitialized memory pointed to by `p`, using placement-new.

    Parameters:

      - p – pointer to allocated uninitialized memory.

      - args – the constructor arguments to use.

  template<class U>
  inline void destroy(U *p)

    Calls the destructor of the object pointed to by `p`.

    Parameters:

      p – pointer to the object that is going to be destroyed.

  template<class U>
  inline aligned_allocator(const aligned_allocator<U, A>&) noexcept

    Extended copy constructor.

  template<class U>
  struct rebind

## Alignement Checker

template<class Arch = default_arch>
inline bool xsimd::is_aligned(void const *ptr)

  Checks whether pointer `ptr` is aligned according the alignment requirements of `Arch`.

  Returns:

    true if the alignment requirements are met