[英]Can I call memcpy() and memmove() with “number of bytes” set to zero?
[英]Can you deserialize bytes with memcpy?
如果我有一個帶有基元的類,例如一堆int或chars,是否可以使用memcpy對它進行反序列化和序列化?
MyClass toSerialize;
unsigned char byteDump[sizeof(toSerialize)];
memcpy(&byteDump, &toSerialize, sizeof(toSerialize));
WriteToFile(byteDump);
然后在另一個程序或計算機上,執行以下操作:
MyClass toDeserialize;
unsigned char byteDump[sizeof(toSerialize)];
LoadFile(byteDump);
memcpy(&toDeserialize, &byteDump, sizeof(byteDump));
在某些情況下,我確實可以在同一程序中工作。 但是,如果我嘗試在其他程序或PC上運行它,則有時無法運行,並且MyClass
將具有不同的值。 這安全嗎?
這安全嗎?
在不同的程序或平台之間, memcpy
是不安全的 。 您不能保證類型的字節布局是一致的。
在同一平台上的同一程序中, 僅當 is_trivially_copyable_v<T>
為true
才能使用memcpy
序列化格式良好的*類型T
std::atomic
是一種利用某些可按字節復制的類型的類型。
*如果已定義或默認的構造函數,賦值運算符或析構函數中沒有錯誤,則類型T
被視為“格式正確”。
簡而言之,沒有。 memcpy()
並非為此設計的。 話雖如此,如果您不關心數據和可執行文件的跨平台問題,就可以擺脫它。
只要一致地存儲和檢索數據, memcpy()
就不會在乎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.