Uintptr_tとは何で、何に使用できますか?
uintptr_t
は、ポインターを格納できる符号なし整数型です。これは通常、ポインターと同じサイズであることを意味します。
アーキテクチャのポインター型を保持できる整数型が必要な一般的な理由は、ポインターで整数固有の操作を実行するか、整数の「ハンドル」として提供することでポインターの型を不明瞭にすることです。
編集:Steve Jessopには非常に興味深い追加の詳細があります(盗みません) 別の答えはこちら あなたのペダンティックなタイプのために:)
まず、質問が行われたとき、uintptr_t
はC++ではありませんでした。 C99の<stdint.h>
に、オプションの型としてあります。多くのC++ 03コンパイラがそのファイルを提供しています。また、C++ 11、<cstdint>
にもあり、ここでもオプションであり、定義のためにC99を参照します。
C99では、「voidへの任意の有効なポインターをこの型に変換し、再びvoidへのポインターに変換できるプロパティを持つ符号なし整数型として定義され、結果は元のポインターと等しくなります」。
これを言ってください。サイズについては何も言いません。
uintptr_t
は、void*
と同じサイズになる場合があります。大きいかもしれません。このようなC++の実装はひねくれたアプローチを取っていますが、それはおそらく小さいかもしれません。たとえば、void*
が32ビットである仮想プラットフォームの24ビットのみが使用される仮想プラットフォームでは、要件を満たす24ビットのuintptr_t
を使用できます。実装がそれを行う理由はわかりませんが、標準では許可されています。
これは、ポインタのサイズとまったく同じ符号なし整数型です。ポインターで何か異常なことをする必要があるときはいつでも-たとえば、すべてのビットを反転する(理由を聞かないでください)ようにuintptr_t
にキャストし、通常の整数として操作してからキャストバックします。
「uintptr_tデータ型とは」という部分に対する多くの良い答えがすでにあります。 「何に使用できるのか」に取り組みます。この投稿の一部。
主にポインタのビット単位の操作用。 C++では、ポインターに対してビット演算を実行できないことに注意してください。理由については、 を参照してください。Cのポインターでビット単位の操作を実行できないのはなぜですか?
したがって、ポインターに対してビット単位の操作を行うには、unitpr_t型にポインターをキャストしてからビット単位の操作を実行する必要があります。
これは、2つのリンクリストのように両方向に移動できるように、ビット単位の排他的または2つのポインターをXORリンクリストに格納するために作成した関数の例です。各ノードのポインター。
template <typename T>
T* xor_ptrs(T* t1, T* t2)
{
return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(t1)^reinterpret_cast<uintptr_t>(t2));
}