uintptr_t便携式替代品

时间:2011-02-16 05:36:39

标签: visual-c++ memory alignment pointer-arithmetic

我想检查某些类型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 个答案:

答案 0 :(得分:1)

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