如何检查指针是否指向正确对齐的内存位置



给定对某些存储的void *,如何在没有任何实现定义行为的情况下检查它是否指向正确对齐的存储?

当然我们有std::align,但是有没有更有效的方法呢?

template <std::size_t alignment>
inline bool is_aligned(void * ptr) noexcept {
    std::size_t max = 1u;
    return std::align(alignment, 1u, ptr, max);
}

PS:我需要以C++标准兼容的方式执行此操作,而不依赖于任何特定于平台(实现定义的(黑客。

PPS:我为我的(理解(英语道歉,它不是我的母语。


编辑(2018.08.24(:从标题中删除了"有效",添加了更多措辞以强调我不希望定义任何实现或特定于平台的行为。

如果在将

地址与所需的对齐方式分开时余数不为零,则地址未对齐。

inline bool
is_aligned(const void * ptr, std::uintptr_t alignment) noexcept {
    auto iptr = reinterpret_cast<std::uintptr_t>(ptr);
    return !(iptr % alignment);
}

不过,由于演员阵容的原因,这不可能是骗子。

此外,这依赖于实现定义的事实,即从指针到整数的转换必须保留地址的数字表示形式。正如评论所指出的,标准并不能保证这一点,因此此功能不一定可以移植到所有平台。这也是正确的,因为实现提供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));
}

最新更新