uintptr_t便携式替代品

led*_*kol 9 memory alignment pointer-arithmetic visual-c++

我想检查某种类型的内存对齐T.直截了当的方法是

if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...
Run Code Online (Sandbox Code Playgroud)

但是,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);
}
Run Code Online (Sandbox Code Playgroud)

或者那样(摆脱乘法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);
}
Run Code Online (Sandbox Code Playgroud)

你怎么看待这种解决方案?它足够便携吗?我没有看到任何原因导致失败,但我想证实.

谢谢.

Enn*_*nno 1

我不确定这里的问题是什么。“你怎么认为?” 我认为 ptrdiff_t 确实是表示两个指针之间差异的正确数据类型,但是如果两个指针没有指向来自简单分配的连续内存块(并且作为推论,两者都没有),那么比较两个指针就没有什么意义。被比较的两个指针的值应该为 NULL)。