Ответ 1
Если остаток не равен нулю при делении адреса с требуемым выравниванием, то адрес не выравнивается.
inline bool
is_aligned(const void * ptr, std::uintptr_t alignment) noexcept {
auto iptr = reinterpret_cast<std::uintptr_t>(ptr);
return !(iptr % alignment);
}
Это не может быть constexpr, хотя, из-за актерского состава.
Кроме того, это основывается на факте, определяемом реализацией, что преобразование из указателя в целое число должно сохранять числовое представление адреса. Как отмечено в комментариях, это не гарантируется стандартом, поэтому эта функция не обязательно переносима на все платформы. Это также верно, потому что для реализации необязательно предоставлять std::uintptr_t
.
Я ожидаю, что это понадобится только при выравнивании для типа, так что это может быть более удобным:
template<class T>
bool
is_aligned(const void * ptr) noexcept {
auto iptr = reinterpret_cast<std::uintptr_t>(ptr);
return !(iptr % alignof(T));
}