【问题标题】:How to store a memory address in an integer?如何将内存地址存储为整数?
【发布时间】:2012-10-25 11:25:36
【问题描述】:

这与找到的here 的问题标题完全相同——我还想将内存地址存储在变量中——或者更确切地说,将void* 存储在变量中。但是,我宁愿将其存储为某种形式的 int 而不是 string,因为我想在之后将其转换回指针。

这是因为它是一个类的成员,然后我想用 boost serialize 进行序列化,如果我确实使用了void*,boost serialize 可能会尝试存储指针指向的内容,这不会对我来说不是很明智。

对于 32 位和 64 位 gcc 和 MSVC,我需要它,所以基本上我想知道在同一平台上是否有一个与指针大小相同的内置整数类型。或者,我想我需要IFDEF我自己的类型?

【问题讨论】:

  • 如果是为了序列化,存储指针对我来说似乎根本不明智。只是好奇,它指向什么?
  • 一个复杂的环境——在序列化时,它是一个指向所述环境的完整指针。反序列化时,它仅用作识别两个对象是否引用同一环境的标识符。除此之外,序列化指针有很多理由,但通常只针对指向的对象——在这种情况下的 boost 序列化中有很多例子,但只有一个是共享指针,指向的对象只需要序列化一次。
  • 我知道这个技巧。这是不值得的。不要将序列化的 int_ptr 转回指针。您的代码最终会取消引用,而不是指针。仅将真正的工作指针存储在指针变量中。如果您必须创建一个用 int_ptr 代替指针的并行结构,但此时您想要创建真正的结构,则需要指向一些实际数据。我明白了,您的解决方案似乎很简单……但事实并非如此。
  • 这实际上不是我们在这里使用的技术。我们实际上只将它转换回输出它,非常像std::cout << reinterpret_cast<void*>(xxx) << ...

标签: c++ 32bit-64bit void-pointers


【解决方案1】:

intptr_tuintptr_t 是整数类型,它们的大小足以容纳void*。它们由<cstdint> 中的C++11 和<stdint.h> 中的C99 定义

如果uintptr_t 不可用,您可以尝试uintmax_t,在同一标头中定义或由<boost/cstdint.hpp> 中的Boost 定义。

【讨论】:

  • 你不会把数据放回去 - 我将它转换回指针的唯一原因是当我将它输出到 ostream 时它具有与以前相同的格式。
【解决方案2】:

你不能序列化指针。

只是因为当你反序列化它时,指针将无效。

使用 JSON、XML、XDR 等内容。您的选择。

序列化是为了使其扁平化。指针是一个分支。

顺便说一句 - 你忽略了一个事实,即 C++ 在类型安全方面被认为要好一些。

【讨论】:

    【解决方案3】:

    在 C++ 中将对象的地址转换为整数类型(不使用 C 风格的强制转换)的一种方法是使用 reinterpret_cast。如其他答案中所述,保证能够保存指针地址的整数类型是 uintptr_t。

    uintptr_t myint = reinterpret_cast<uintptr_t>(&myobject)

    uintptr_t myint = reinterpret_cast<uintptr_t>(mypointer)

    【讨论】:

    • 解释一下你的陈述在做什么可能会有所帮助。另外,如果您已经拥有mypointer,为什么还要再次输入地址?
    • 你说得对,这并不完全不言自明。添加了简要说明。
    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多