【发布时间】:2017-06-24 21:42:24
【问题描述】:
给定某个存储的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):从标题中删除了“有效”,添加了更多措辞以强调我不希望任何定义的实现或特定于平台的行为。
【问题讨论】:
-
另请注意,对齐是根据定义平台特定的,并且对从 reinterpret_cast 返回的数值进行操作,例如 @Some 建议的本质上是未定义或实现定义的行为。
-
最后,如果您使用
new或new[]分配了内存,您可以确定内存应该与您正在使用的类型完全对齐。也许您可以通过检查对齐方式来启发我们了解您实际尝试解决的问题?为什么需要检查? -
@Someprogrammerdude 当有一个包含任意原始数据的缓冲区,并且需要检查它的一部分是否可以作为某种类型直接访问
T或者是否需要使用 @Someprogrammerdude 时,这可能很有用987654328@ 在以T类型访问这些数据之前/之后将相应的数据从缓冲区复制到缓冲区。 -
@Someprogrammerdude 在 C++17 之前仅适用于具有标准对齐的类型,不适用于
struct OveralignedInt { alignas(1024) int i; }; -
@jotik 即使满足对齐要求,也可以将任意原始数据(
char缓冲区)作为T访问。您必须首先以放置new开始对象的生命周期。
标签: c++ c++11 c++14 memory-alignment c++17