static_assert(sizeof(VecType) == sizeof(VecType::ITEM_TYPE) * VecType::ITEM_COUNT, \
#VecType " size mismatch! Possible unexpected padding."); \
static_assert(std::is_standard_layout_v<VecType>, \
#VecType " is not Standard Layout. This breaks C-compatibility/offsetof."); \
\
static_assert(std::is_trivially_copyable_v<VecType>, \
#VecType " is not trivially copyable. This hurts pass-by-value performance."); \
static_assert(std::is_trivially_destructible_v<VecType>, \
#VecType " has a non-trivial destructor. This prevents it from being in a union."); \
\
static_assert(alignof(VecType) >= alignof(VecType::ITEM_TYPE), \
#VecType " alignment is weaker than its scalar component."); \
\
static_assert(std::is_default_constructible_v<VecType>, \
#VecType " should be default constructible for array allocations."); \
static_assert(std::is_trivially_copy_constructible_v<VecType>, \
#VecType " copy constructor is not trivial."); \
static_assert(std::is_trivially_move_constructible_v<VecType>, \
#VecType " move constructor is not trivial (math types should be POD-like).");