37template <
typename T>
struct aligned_deleter
39 void operator()(T*
p)
const noexcept
53template <
typename T>
struct aligned_destructor_deleter
56 explicit aligned_destructor_deleter(std::size_t n) noexcept :
count(n) {}
58 void operator()(T*
p)
const noexcept
62 for (std::size_t i = 0; i <
count; ++i)
80inline void* allocate_raw(std::size_t
bytes, std::size_t align)
84 ptr = _aligned_malloc(
bytes, align);
85 if (!ptr)
throw std::bad_alloc();
90 if (
int err = posix_memalign(&ptr, align,
bytes);
err)
92 throw std::bad_alloc();
102template <
typename T>
using aligned_buf_t = std::unique_ptr<T[], aligned_deleter<T>>;
107template <
typename T>
using aligned_buf_with_dtor_t = std::unique_ptr<T[], aligned_destructor_deleter<T>>;
122 if (N == 0)
return detail::aligned_buf_t<T>{
nullptr, detail::aligned_deleter<T>{}};
123 auto result = detail::aligned_buf_t<T>(
static_cast<T*
>(detail::allocate_raw(
sizeof(T) * N, align)),
124 detail::aligned_deleter<T>{});
147 return allocate_uninitialized_buffer<T>(N, align);
153 return detail::aligned_buf_with_dtor_t<T>{
nullptr, detail::aligned_destructor_deleter<T>{0}};
156 void* raw = detail::allocate_raw(
sizeof(T) * N, align);
157 T* ptr =
static_cast<T*
>(raw);
160 for (std::size_t i = 0; i < N; ++i)
162 ::new (
static_cast<void*
>(ptr + i)) T();
166 return detail::aligned_buf_with_dtor_t<T>(ptr, detail::aligned_destructor_deleter<T>{N});
184 return allocate_uninitialized_buffer<T>(N, align);
190 return detail::aligned_buf_with_dtor_t<T>{
nullptr, detail::aligned_destructor_deleter<T>{0}};
192 void* raw = detail::allocate_raw(
sizeof(T) * N, align);
193 T* ptr =
static_cast<T*
>(raw);
195 return detail::aligned_buf_with_dtor_t<T>(ptr, detail::aligned_destructor_deleter<T>{N});
Whether raw allocation may establish storage for T without construction.
Definition common/initialization.hpp:46
auto allocate_temporary_buffer_uninitialized(std::size_t N, std::size_t align=64)
Allocate a temporary buffer of T[N] that is always uninitialized.
Definition aligned_buffer.hpp:179
auto allocate_temporary_buffer(std::size_t N, std::size_t align=64)
Allocate a temporary buffer of T[N] aligned to align.
Definition aligned_buffer.hpp:142
detail::aligned_buf_t< T > allocate_uninitialized_buffer(std::size_t N, std::size_t align=64)
Allocate raw, aligned storage for T[N] without running constructors or destructors.
Definition aligned_buffer.hpp:120
Definition data_table.cpp:8
Definition async/async.hpp:26
std::size_t bytes
Definition presentation.cpp:18