如何检查指针是否指向正确对齐的内存位置
How to check if a pointer points to a properly aligned memory location?
给定对某些存储的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));
}
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 如何检查指针是否指向正确对齐的内存位置
- C++ 提升日志位置(索引)格式对齐
- C++ 将文本文件中不同行/位置的相同单词与每行中的相同位置对齐
- 将对象位置与网格对齐
- 对齐C++指针位置的目的是什么