Как сохранить адрес памяти в целое число?

Это точно такое же название вопроса, как найдено Вот — Я также хотел бы сохранить адрес памяти в переменной — или, скорее, void* в переменной. Тем не менее, я бы предпочел хранить его в какой-то форме int а не string, как я хотел бы привести его обратно к указателю впоследствии.

Это потому, что он является членом класса, который я хотел бы затем сериализовать с помощью boost serialize, и если бы я использовал void*boost serialize может попытаться сохранить то, на что указывает указатель, что в моем случае не очень разумно.

Мне это нужно для 32- и 64-битных gcc и MSVC, поэтому мне было интересно, существует ли встроенный целочисленный тип размером с указатели на той же платформе. В качестве альтернативы, я думаю, мне нужно IFDEF мой собственный тип?

5

Решение

intptr_t а также uintptr_t целочисленные типы, которые достаточно велики, чтобы содержать void*, Они определены C ++ 11 в <cstdint> и С99 в <stdint.h>

Если uintptr_t недоступен, вы можете попробовать uintmax_t, определенные в том же заголовке (ах) или Boost в <boost/cstdint.hpp>.

8

Другие решения

Один из способов преобразования адреса объекта в целочисленный тип в C ++ (без обращения к приведениям в стиле C) — использовать reinterpret_cast. Целочисленный тип, который гарантированно может содержать адрес указателя, как упоминалось в других ответах, — это uintptr_t.

uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)

или же

uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)

5

Вы не можете сериализовать указатели.

Просто потому, что когда вы дойдете до десериализации, указатель будет недействительным.

Используйте что-то вроде JSON, XML, XDR и т. Д. На ваш выбор.

Сериализация должна сделать это плоским. Указатели это ветка.

Кстати, вы игнорируете тот факт, что C ++ должен быть немного лучше, поскольку он более безопасен для типов.

0