我想检查某种类型的内存对齐T
。直接的方法是
if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...
但是,uintptr_t
它不是现有 C++ 标准的一部分,并且某些编译器不支持它,因此我正在寻找一种可移植的替代方法来执行此操作,并且std::ptrdiff_t
对我来说看起来不错。std::ptrdiff_t
保证能够存储两个指针之间的差异,但谁说这些指针之一不能是空指针?在这种情况下std::ptrdiff_t
,必须至少与指针本身的大小相同。
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff = (ptr - static_cast<T*>(0)) * sizeof(T);
return ((diff & __alignof(T) - 1) == 0);
}
或像那样(摆脱乘法sizeof(T)
)
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff =
reinterpret_cast<const char*>(ptr) - static_cast<const char*>(0);
return ((diff & __alignof(T) - 1) == 0);
}
您如何看待这样的解决方案?便携性够吗?我看不出这会失败的任何原因,但是我想确认一下。
谢谢。