gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:43:50 45 4
gpt4 key购买 nike

给定一个 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++ 标准兼容的方式执行此操作,而不依赖于任何特定于平台(实现定义)的 hack。

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);
}

由于 Actor 阵容,这不能是 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));
}

关于c++ - 如何检查指针是否指向正确对齐的内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093360/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com