10#if defined(__cpp_aligned_new) && (__cpp_aligned_new >= 201606)
11 #define Q_HAS_ALIGNED_NEW 1
13 #define Q_HAS_ALIGNED_NEW 0
31 static constexpr std::size_t k_min_platform_align =
alignof(
void *);
35 template<
class Policy>
38 static inline bool is_pow2(std::size_t x) {
return x && ((x & (x - 1)) == 0); }
45 if ( al <= k_min_platform_align )
46 return Policy::allocate(
n);
47 return portable_aligned_alloc(
n, al);
55 throw std::bad_alloc();
63 if ( al <= k_min_platform_align )
64 Policy::deallocate(p);
66 portable_aligned_free(p);
71 static inline void *portable_aligned_alloc(std::size_t
size, std::size_t align)
noexcept
73 if ( align <
alignof(
void *) )
74 align =
alignof(
void *);
77 const std::size_t extra = align - 1 +
sizeof(
void *);
78 if (
size > SIZE_MAX - extra )
80 void *base = Policy::allocate(
size + extra);
83 std::uintptr_t raw =
reinterpret_cast<std::uintptr_t
>(base) +
sizeof(
void *);
84 std::uintptr_t aligned = (raw + (align - 1)) & ~(
static_cast<std::uintptr_t
>(align) - 1);
85 reinterpret_cast<void **
>(aligned)[-1] = base;
86 return reinterpret_cast<void *
>(aligned);
90 static inline void portable_aligned_free(
void *p)
noexcept
94 void *base =
reinterpret_cast<void **
>(p)[-1];
95 Policy::deallocate(base);
106#define CXX17_MEMORY_ALLOCATION_FUNCS_USING_UNALIGNED_POLICY(Policy) \
108 static void *operator new(std::size_t n) \
110 if ( void *p = Policy::allocate(n) ) \
112 throw std::bad_alloc(); \
114 static void operator delete(void *p) noexcept { Policy::deallocate(p); } \
115 static void operator delete(void *p, std::size_t) noexcept { Policy::deallocate(p); } \
117 static void *operator new[](std::size_t n) { return operator new(n); } \
118 static void operator delete[](void *p) noexcept { operator delete(p); } \
119 static void operator delete[](void *p, std::size_t n) noexcept { operator delete(p, n); } \
121 static void *operator new(std::size_t, void *p) noexcept { return p; } \
122 static void operator delete(void*, void*) noexcept {}
126#define CXX17_ALIGNED_NEWDELETE_USING_UNALIGNED_POLICY(Policy) \
128 static void *operator new(std::size_t n, std::align_val_t a) \
130 const std::size_t al = static_cast<std::size_t>(a); \
131 return qalloc_detail::unaligned_alloc_aligner<Policy>::aligned_allocate_or_throw(n, al); \
133 static void operator delete(void *p, std::align_val_t a) noexcept \
135 const std::size_t al = static_cast<std::size_t>(a); \
136 qalloc_detail::unaligned_alloc_aligner<Policy>::aligned_deallocate(p, al); \
138 static void operator delete(void *p, std::size_t, std::align_val_t a) noexcept \
140 operator delete(p, a); \
143 static void *operator new[](std::size_t n, std::align_val_t a) { return operator new(n, a); } \
144 static void operator delete[](void *p, std::align_val_t a) noexcept { operator delete(p, a); }\
145 static void operator delete[](void *p, std::size_t n, std::align_val_t a) noexcept \
147 operator delete(p, n, a); \
151#define CXX17_ALIGNED_NEWDELETE_USING_UNALIGNED_POLICY(Policy)
155#define CXX17_MEMORY_ALLOCATION_FUNCS_USING_POLICY(Policy) \
156 CXX17_MEMORY_ALLOCATION_FUNCS_USING_UNALIGNED_POLICY(Policy) \
157 CXX17_ALIGNED_NEWDELETE_USING_UNALIGNED_POLICY(Policy)
idaman size_t n
Definition pro.h:1000
asize_t size
Definition kernwin.hpp:6701
Definition qalloc_shim.hpp:29
Definition qalloc_shim.hpp:37
static void * aligned_allocate(std::size_t n, std::size_t al) noexcept
Definition qalloc_shim.hpp:43
static void aligned_deallocate(void *p, std::size_t al) noexcept
Definition qalloc_shim.hpp:59
static void * aligned_allocate_or_throw(std::size_t n, std::size_t al)
Definition qalloc_shim.hpp:51
static bool is_pow2(std::size_t x)
Definition qalloc_shim.hpp:38