uintptr_t便携式替代品
我想检查某种类型的内存对齐
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);
}
你怎么看待这种解决方案?它足够便携吗?我没有看到任何原因导致失败,但我想证实。
谢谢。
没有找到相关结果
已邀请:
1 个回复
耐扫鹤胶鞭