是否可以保存指針中存儲的實際地址而不是指向的對象?如何保存存儲在指針中的實際地址
我的意思是,boost::serialization
自動序列化對象引用的對象,而不是對象的地址,但在我的情況下,有很多對同一對象的引用,我不想一遍又一遍地將它們序列化,所以我需要保存這種指針的地址。
是否可以保存指針中存儲的實際地址而不是指向的對象?如何保存存儲在指針中的實際地址
我的意思是,boost::serialization
自動序列化對象引用的對象,而不是對象的地址,但在我的情況下,有很多對同一對象的引用,我不想一遍又一遍地將它們序列化,所以我需要保存這種指針的地址。
這是行不通的。運行時對象的內存位置會隨着程序的執行而不同。
什麼會工作是某種對象目錄或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
「如果同一指針不止一次序列化,則只有一個實例被添加到存檔中。被重新讀入。唯一發生的操作是將第二個指針設置爲等於第一個。「
「運行時對象的內存位置會隨着程序執行的不同而不同」 - 是的,我完全意識到這一點。我打算使用這個地址作爲一種唯一的ID只有 – FrozenHeart
所以我的問題仍然是開放的。我如何序列化指針的地址? – FrozenHeart
所以是的,我可以反序列化一個指向0x12345的指針,而0x12345在程序的當前狀態下對我不可用。這只是一個獨特的ID,我會稍後改變它的位置。 – FrozenHeart
將其轉換爲整數?而且,正如人們已經指出的那樣,你做的事情是錯誤的。如果你想要一個唯一的ID,很好。生成一個。但至少將地址存儲在文件中會造成誤導。 – sehe