jot*_*tik 30 c++ memory-alignment c++11 c++14 c++17
给定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:我为我(理解)英语而道歉,而不是我的母语.
EDIT(2018.08.24):从标题中删除了"有效",添加了更多的措辞,强调我不希望任何实现定义或特定于平台的行为.
eer*_*ika 20
如果在将地址与所需对齐分开时余数不为零,则地址不对齐.
inline bool
is_aligned(const void * ptr, std::uintptr_t alignment) noexcept {
    auto iptr = reinterpret_cast<std::uintptr_t>(ptr);
    return !(iptr % alignment);
}
因为演员阵容,所以不能是constexpr.
此外,这依赖于实现定义的事实,即从指针到整数的转换必须保留地址的数字表示.正如评论所指出的那样,标准无法保证,因此该功能不一定能够移植到所有平台.这也是事实,因为它是可选的实现提供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));
}
| 归档时间: | 
 | 
| 查看次数: | 3397 次 | 
| 最近记录: |