6

これは、ここにある質問のタイトルとまったく同じです。メモリアドレスも変数に格納したいのですが、むしろ変数に格納しvoid*ます。ただし、後でポインタにキャストし直したいintので、ではなく何らかの形式で保存したいと思います。string

これは、ブーストシリアル化を使用してシリアル化するクラスのメンバーであるためです。ブーストシリアル化を使用した場合void*、ポインターが指しているものを格納しようとする可能性がありますが、これは私の場合はあまり意味がありません。場合。

32ビットと64ビットのgccとMSVCでこれが必要なので、基本的に、同じプラットフォーム上にポインターのサイズの整数型が組み込まれているかどうか疑問に思いました。あるいは、私はIFDEF自分のタイプにする必要があると思いますか?

4

3 に答える 3

9

intptr_tおよびuintptr_tは、を保持するのに十分な大きさの整数型ですvoid*。それらは、C++11<cstdint>およびC99によって定義されています。<stdint.h>

uintptr_tが利用できない場合はuintmax_t、同じヘッダーで定義されているか、Boostinで定義されているを試すことができます<boost/cstdint.hpp>

于 2012-11-05T15:33:06.313 に答える
6

オブジェクトのアドレスをC++で(Cスタイルのキャストに頼らずに)整数型に変換する1つの方法は、reinterpret_castを使用することです。他の回答で述べられているように、ポインタアドレスを保持できることが保証されている整数型はuintptr_tです。

uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)

また

uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)

于 2014-02-06T16:44:54.170 に答える
0

ポインタをシリアル化することはできません。

逆シリアル化するために移動すると、ポインタが無効になるからです。

JSON、XML、XDRなどを使用してください。選択してください。

シリアル化はそれをフラットにすることです。ポインタはブランチです。

ところで-あなたは、C++がよりタイプセーフであるという点で少し優れていると思われるという事実を無視しています。

于 2012-11-05T15:39:30.263 に答える