这与找到的问题标题here完全相同 - 我还想将一个内存地址存储在一个变量中 - 或者更确切地说,一个void*
存储在一个变量中。但是,我宁愿将其存储在int
而不是string
的某种形式中,因为我希望之后将其转换回指针。
这是因为它是一个类的成员,我想用boost serialize序列化,如果我确实使用void*
,boost serialize可能会尝试存储指针指向的内容,在我的情况下,这不是很明智。
我需要32位和64位gcc和MSVC,所以基本上我想知道是否有一个内置的整数类型,它是同一平台上指针的大小。或者,我想我需要IFDEF
我自己的类型?
答案 0 :(得分:8)
intptr_t
和uintptr_t
是整数类型,足以容纳void*
。它们由<cstdint>
中的C ++ 11和<stdint.h>
如果uintptr_t
不可用,您可以尝试使用相同标头中定义的uintmax_t
或<boost/cstdint.hpp>
中的Boost。
答案 1 :(得分:6)
在C ++中将对象的地址转换为整数类型的一种方法(不使用C风格的转换)是使用reinterpret_cast。保证能够保存其他答案中提到的指针地址的整数类型是uintptr_t。
uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)
或
uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)
答案 2 :(得分:0)
您无法序列化指针。
只是因为当你绕过反序列化时,指针将无效。
使用类似JSON,XML,XDR等的选择。
序列化是为了让它变平。指针是一个分支。
BTW - 你忽略了这样一个事实:C ++假设在更安全的方面更好一点。