2009-12-05 46 views
1

我得到了一些C++代碼,我們用它來序列化任意數據並將其作爲元數據存儲爲專用圖像格式。將STL字符串和STL向量轉換爲void *?

無論如何,它把它作爲一個void *。我可以只做一個簡單的memcpy嗎?還是有更好的方法來做到這一點?

回答

4

對於std :: string,您可以使用c_str()來獲取指向內部字符串的char *。

對於std :: vector,標準規定元素在內存中是連續的,所以你可以像訪問&v [0]那樣訪問指向數據開頭的指針。

你當然應該小心這些,因爲你基本上是使用一個指向對象內部數據的指針來處理庫。如果需要,您可以使用memcpy將上述數據作爲src指針複製數據,但顯然您需要注意使用正確的大小。在不知道函數的細節的情況下,您將這些數據傳遞給我們不可能評論是否需要這種複製。

5

STL字符串可能不會將數據存儲在連續的內存塊中。使用c_str()方法從中獲取一個c樣式的字符串並對其進行序列化。由於矢量以連續的方式存儲其數據,因此您可以直接對其進行序列化。

+1

序列化向量?希望你的意思是獲取第一個元素的地址並序列化數組,對吧? (類似'&v [0]') – jalf 2009-12-05 08:38:05

+0

是的,我的意思是向量的元素 – Naveen 2009-12-05 10:46:31

0

STL向量將它的元素存儲在連續的內存中,因此可以使用memcopy複製知道元素大小和數量的元素。

+0

只要確保從第一個元素(即&v [0])複製,而不是從其自身所在向量對象的位置複製(即&v )。 – 2009-12-05 09:46:55

2

正如其他人指出的,& v [0]爲您提供了一個指向矢量內數組的指針。

但是,請注意,使用memcpy序列化數據通常在C++中完全不可移植。數據必須是Plain-Old-Data類型(即沒有不平凡的構造函數,虛函數,用戶定義的析構函數等),但即使如此,除非將其讀回到完全相同的位置,否則不應該期望得到正確的行爲程序。

更改目標平臺,編譯器甚至編譯器設置可以改變數據的格式。例如,編譯器允許並且通常會在結構中添加填充字段。

如果您需要這樣做,有很好的庫允許您序列化複雜數據,如Boost Serialization。它已經內置了對std :: vector和其他標準類型的支持。