9

ある種のメモリ アラインメントのチェックを実行したいT。これを行う簡単な方法は次のとおりです。

if (((uintptr_t)&var & __alignof(T) - 1) == 0) ...

ただし、uintptr_t既存の C++ 標準の一部ではなく、一部のコンパイラではサポートされていないため、これを行う移植可能な代替方法を探しておりstd::ptrdiff_t、私にとっては良さそうです。std::ptrdiff_t2 つのポインターの違いを格納できることが保証されていますが、これらのポインターの 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);
}

このような解決策についてどう思いますか。携帯性は十分ですか?これが失敗する理由はわかりませんが、確認したいと思います。

ありがとう。

4

1 に答える 1

1

ここでの質問が何であるかわかりません。"どう思いますか?" ptrdiff_t は確かに 2 つのポインターの違いを表す正しいデータ型だと思いますが、2 つのポインターが単純な割り当てに由来する連続したメモリのブロックを指していない場合 (そして必然的に、どちらも比較される 2 つのポインターのいずれかが NULL になる必要があります)。

于 2011-02-17T08:04:52.347 に答える