ある種のメモリ アラインメントのチェックを実行したいT
。これを行う簡単な方法は次のとおりです。
if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...
ただし、uintptr_t
既存の C++ 標準の一部ではなく、一部のコンパイラではサポートされていないため、これを行う移植可能な代替方法を探しておりstd::ptrdiff_t
、私にとっては良さそうです。std::ptrdiff_t
2 つのポインターの違いを格納できることが保証されていますが、これらのポインターの 1 つが null ポインターになることはできないと誰が言いますか? その場合std::ptrdiff_t
、ポインタ自体と少なくとも同じサイズである必要があります。
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff = (ptr - static_cast<T*>(0)) * sizeof(T);
return ((diff & __alignof(T) - 1) == 0);
}
またはそのように( による乗算を取り除くためsizeof(T)
)
template <typename T> bool is_properly_aligned(const T* const ptr)
{
std::ptrdiff_t diff =
reinterpret_cast<const char*>(ptr) - static_cast<const char*>(0);
return ((diff & __alignof(T) - 1) == 0);
}
このような解決策についてどう思いますか。携帯性は十分ですか?これが失敗する理由はわかりませんが、確認したいと思います。
ありがとう。