簡體   English   中英

在從磁盤寫入和讀取的結構中使用std :: bitset可以嗎?

[英]Is it ok to use std::bitset in a struct that is written and read from disk?

我需要在文件中存儲位,並且std::bitset對此非常合適,因為當我再次讀回結構時,我需要執行其許多操作。 該類似乎僅由位數組組成,而沒有其他成員數據。

所以代替這個

BYTE minuteOfDay[(60 * 24 / CHAR_BIT) + ((60 * 24 % CHAR_BIT) ? 1 : 0)];

我可以這樣:

std::bitset<60 * 24> minuteOfDay;

如果在將來的Visual Studio版本中該類應更改,並且我需要讀取使用舊版本編寫的文件,我想我仍然可以只將舊的<bitset>標頭復制到我的項目中。

但是,在做出一個非常愚蠢的決定之前:這個想法是否由於我目前無法預見的原因而存在某種缺陷?

這個想法有缺陷嗎?

是。

首先,故障模式:如您所猜, std::bitset可能會更改其內部表示。 除此之外,它還是不是(保證為)標准布局類型,因此初始寫入是不確定的。 除此之外 ,你會怎么讀回嗎? 大概只是讀到一個正確對齊的緩沖區中,然后對它進行類型標記嗎? 那也是非法的。

其次,建議的解決方案:復制舊的<bitset>標頭很可怕。 它不會成為實際標准庫的一部分,並且仍然會非法將其自身注入到命名空間std 完全有可能其他代碼將使用本地std::bitset並導致可怕的錯誤。

最重要的是,與標准庫的本機版本分離時,它可能根本無法工作。

第三,正確的解決方案:

  1. 使用std::bitset的公共接口將其序列化(反序列化)為一些明確定義的格式

    請注意,無論如何這都是微不足道的: std::bitset::to_string已經存在,您可以從該字符串重新構造一個實例

  2. 編寫一個替換類,該類由您控制並保證可以簡單地序列化。 僅僅因為您沒有免費獲得std::bitset並不意味着您必須使用原始char數組將所有東西放在一起

我了解通過將其寫入文件意味着您要獲取std::bitset變量的地址並寫入原始字節? 在這種情況下,答案為“ 否” 此過程稱為實體序列化或實體編碼,由於std::bitset不是標准布局類型,因此您不能實體序列化std::bitset (或包含它作為成員字段的任何類)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM