diff --git a/Internal.h b/Internal.h index e50c6ac..4f2c378 100644 --- a/Internal.h +++ b/Internal.h @@ -154,6 +154,7 @@ inline void *operator new[](size_t size, std::align_val_t align, /// align must be a power of two template T *align_up(T *t, size_t align) { + assert(std::popcount(align) == 1); auto unaligned = uintptr_t(t); auto aligned = (unaligned + align - 1) & ~(align - 1); return reinterpret_cast(reinterpret_cast(t) + aligned - @@ -162,6 +163,7 @@ template T *align_up(T *t, size_t align) { /// align must be a power of two constexpr inline int align_up(uint32_t unaligned, uint32_t align) { + assert(std::popcount(align) == 1); return (unaligned + align - 1) & ~(align - 1); } @@ -180,7 +182,7 @@ struct Arena::ArenaImpl { inline Arena::Arena(int initialSize) : impl(nullptr) { if (initialSize > 0) { auto allocationSize = - align_up(initialSize + sizeof(ArenaImpl), sizeof(ArenaImpl)); + align_up(initialSize + sizeof(ArenaImpl), alignof(ArenaImpl)); impl = (Arena::ArenaImpl *)safe_malloc(allocationSize); impl->prev = nullptr; impl->capacity = allocationSize - sizeof(ArenaImpl); @@ -216,7 +218,7 @@ inline void *operator new(size_t size, std::align_val_t align, Arena &arena) { (arena.impl ? std::max(sizeof(Arena::ArenaImpl), arena.impl->capacity * 2) : 0)), - sizeof(Arena::ArenaImpl)); + alignof(Arena::ArenaImpl)); auto *impl = (Arena::ArenaImpl *)safe_malloc(allocationSize); impl->prev = arena.impl; impl->capacity = allocationSize - sizeof(Arena::ArenaImpl);