【问题标题】:How to save an actual address stored in the pointer如何保存存储在指针中的实际地址
【发布时间】:2017-11-08 04:55:28
【问题描述】:

是否可以保存存储在指针中的实际地址而不是它指向的对象?

我的意思是,boost::serialization 自动序列化 a 引用的对象,而不是对象的地址,但在我的情况下,有很多对同一个对象的引用,我不想一遍又一遍地序列化它们再次,所以我只需要保存此类指针的地址。

【问题讨论】:

  • 将其转换为整数?而且,正如人们指出的那样,你做的事情......错了。如果你想要一个唯一的 ID,很好。生成一个。但是将地址存储在文件中至少会产生误导。

标签: serialization boost boost-serialization


【解决方案1】:

那是行不通的。一个对象在运行时的内存位置会随着程序的一次执行而变化。

可以使用某种对象目录或 ID 系统,例如,如果对象具有内置的唯一 ID。如果您仅将其用作对象 ID,则指针地址甚至可能适用于此。

然后(如果您覆盖正常的序列化和反序列化)您可以编写每个对象一次,在第一次引用它们时读取它们并将位置存储到地图中,然后如果再次反序列化相同的 ID,您可以使用地图查找它的指针。

这可能不值得,除非你有大量的单一类型对象的重复。

boost::archive::text_oarchive oa(ofs);
....
unsigned long long int foo = (unsigned long long int) &my_object;  // might need to lower warning level depending on compiler
oa << foo;

您应该确保 boost 尚未为您执行此操作。 boost.org 关于序列化的教程意味着它只写出指针引用的对象一次:http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/tutorial.html#pointers

"如果同一个指针被序列化多次,只有一个实例被添加到存档中。回读时,不会读回任何数据。唯一发生的操作是将第二个指针设置为等于首先。”

【讨论】:

  • “对象在运行时的内存位置会随着程序的一次执行到下一次执行而变化”——是的,我完全清楚这一点。我打算将此地址用作某种唯一 ID
  • 所以我的问题仍然悬而未决。如何序列化指针的地址?
  • 所以是的,我可以反序列化指向 0x12345 的指针,而在程序的当前状态下 0x12345 对我不可用。它只是一个唯一的 ID,我稍后会更改它指向的位置。
  • 你可以自己写,或者分配它然后序列化它。无符号整数 64 = &foo.
  • 添加了示例,并参考了 boost 在某些情况下如何做到这一点
猜你喜欢
  • 2020-11-08
  • 2011-04-25
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多