web-dev-qa-db-ja.com

uintptr_tデータ型とは

Uintptr_tとは何で、何に使用できますか?

218
dimba

uintptr_tは、ポインターを格納できる符号なし整数型です。これは通常、ポインターと同じサイズであることを意味します。

C++ 11以降の標準でオプションで定義されています。

アーキテクチャのポインター型を保持できる整数型が必要な一般的な理由は、ポインターで整数固有の操作を実行するか、整数の「ハンドル」として提供することでポインターの型を不明瞭にすることです。

編集:Steve Jessopには非常に興味深い追加の詳細があります(盗みません) 別の答えはこちら あなたのペダンティックなタイプのために:)

171
Drew Dormann

まず、質問が行われたとき、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を使用できます。実装がそれを行う理由はわかりませんが、標準では許可されています。

219
Steve Jessop

これは、ポインタのサイズとまったく同じ符号なし整数型です。ポインターで何か異常なことをする必要があるときはいつでも-たとえば、すべてのビットを反転する(理由を聞かないでください)ようにuintptr_tにキャストし、通常の整数として操作してからキャストバックします。

18
sharptooth

「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));
  }
8
BGR