Это точно такое же название вопроса, как найдено Вот — Я также хотел бы сохранить адрес памяти в переменной — или, скорее, void*
в переменной. Тем не менее, я бы предпочел хранить его в какой-то форме int
а не string
, как я хотел бы привести его обратно к указателю впоследствии.
Это потому, что он является членом класса, который я хотел бы затем сериализовать с помощью boost serialize, и если бы я использовал void*
boost serialize может попытаться сохранить то, на что указывает указатель, что в моем случае не очень разумно.
Мне это нужно для 32- и 64-битных gcc и MSVC, поэтому мне было интересно, существует ли встроенный целочисленный тип размером с указатели на той же платформе. В качестве альтернативы, я думаю, мне нужно IFDEF
мой собственный тип?
intptr_t
а также uintptr_t
целочисленные типы, которые достаточно велики, чтобы содержать void*
, Они определены C ++ 11 в <cstdint>
и С99 в <stdint.h>
Если uintptr_t
недоступен, вы можете попробовать uintmax_t
, определенные в том же заголовке (ах) или Boost в <boost/cstdint.hpp>
.
Один из способов преобразования адреса объекта в целочисленный тип в C ++ (без обращения к приведениям в стиле C) — использовать reinterpret_cast. Целочисленный тип, который гарантированно может содержать адрес указателя, как упоминалось в других ответах, — это uintptr_t.
uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)
или же
uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)
Вы не можете сериализовать указатели.
Просто потому, что когда вы дойдете до десериализации, указатель будет недействительным.
Используйте что-то вроде JSON, XML, XDR и т. Д. На ваш выбор.
Сериализация должна сделать это плоским. Указатели это ветка.
Кстати, вы игнорируете тот факт, что C ++ должен быть немного лучше, поскольку он более безопасен для типов.