2017-06-07 118 views
0

是否可以保存指針中存儲的實際地址而不是指向的對象?如何保存存儲在指針中的實際地址

我的意思是,boost::serialization自動序列化對象引用的對象,而不是對象的地址,但在我的情況下,有很多對同一對象的引用,我不想一遍又一遍地將它們序列化,所以我需要保存這種指針的地址。

+0

將其轉換爲整數?而且,正如人們已經指出的那樣,你做的事情是錯誤的。如果你想要一個唯一的ID,很好。生成一個。但至少將地址存儲在文件中會造成誤導。 – sehe

回答

2

這是行不通的。運行時對象的內存位置會隨着程序的執行而不同。

什麼會工作是某種對象目錄或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.org關於序列化的教程意味着它只寫出指針引用的對象一次:http://www.boost.org/doc/libs/1_64_0/libs/serialization/doc/tutorial.html#pointers

「如果同一指針不止一次序列化,則只有一個實例被添加到存檔中。被重新讀入。唯一發生的操作是將第二個指針設置爲等於第一個。「

+0

「運行時對象的內存位置會隨着程序執行的不同而不同」 - 是的,我完全意識到這一點。我打算使用這個地址作爲一種唯一的ID只有 – FrozenHeart

+0

所以我的問題仍然是開放的。我如何序列化指針的地址? – FrozenHeart

+0

所以是的,我可以反序列化一個指向0x12345的指針,而0x12345在程序的當前狀態下對我不可用。這只是一個獨特的ID,我會稍後改變它的位置。 – FrozenHeart