簡體   English   中英

布爾標志與未簽名的字符標志

[英]Bool Flags vs. Unsigned Char Flags

免責聲明:如果我在此帖子中有任何虛假聲明,請糾正我。

考慮一個包含八個布爾成員變量的結構。

/*
 * Struct uses one byte for each flag.
 */
struct WithBools
{
  bool f0 = true;
  bool f1 = true;
  bool f2 = true;
  bool f3 = true;
  bool f4 = true;
  bool f5 = true;
  bool f6 = true;
  bool f7 = true;
};

分配給每個變量的空間的長度為一個字節,如果僅將變量用作標志,這似乎是一種浪費。 就變量而言,一種減少此浪費空間的解決方案是將八個標志封裝到一個無符號char的單個成員變量中。

/*
 * Struct uses a single byte for eight flags; retrieval and
 * manipulation of data is achieved through accessor functions.
 */
struct WithoutBools
{
  unsigned char getFlag(unsigned index)
  {
    return flags & (1 << (index % 8));
  }
  void toggleFlag(unsigned index)
  {
    flags ^= (1 << (index % 8));
  }

private:
  unsigned char flags = 0xFF;
};

這些標志是通過檢索和操縱的。 按位運算符,該結構為用戶提供了檢索和操縱標志的接口。 在減小標志大小的同時,我們現在有兩個附加的方法可以增加結構的大小。 我不知道如何對這種差異進行基准測試,因此無法確定上述結構之間是否存在任何波動。

我的問題是:

1)這兩個結構之間的空間差異可以忽略不計嗎?

2)通常,這種通過將布爾值壓縮為單個字節來“優化”布爾值集合的方法是一個好主意嗎? 要么在嵌入式系統環境中,要么在其他方面。

3) C ++編譯器是否會進行這種優化,以便在可能和適當的情況下壓縮一組布爾變量。

這兩個結構之間的空間差異可忽略不計嗎?

這取決於要存儲多少值以及必須在其中存儲多少空間。大小差為1到8。

通常,通過將它們壓縮為單個字節來“優化”布爾集的方法是一個好主意嗎? 要么在嵌入式系統環境中,要么在其他方面。

同樣,它取決於多少個值和多少空間。 另請注意,使用位而不是字節來處理會增加代碼大小和執行時間。

許多嵌入式系統具有相對較少的RAM和大量的Flash。 代碼存儲在Flash中,因此可以忽略增加的代碼大小,並且節省的內存在小型RAM系統上可能很重要。

C ++編譯器是否會進行這種優化,以便在可能和適當的情況下壓縮一組布爾變量。

假設可以。 我認為這是一種積極的空間優化,但會浪費執行時間。

STL具有vector<bool>的特殊化,出於性能原因,我經常避免使用它vector<char>更快。

現在,我們有兩個其他方法來增加結構的大小

方法是代碼,不會增加結構的大小。 只有數據會構成結構的大小。

3)C ++編譯器是否會進行這種優化,以便在可能和適當的情況下壓縮一組布爾變量。

那是一個響亮的聲音。 不允許編譯器更改數據類型。

1)這兩個結構之間的空間差異可以忽略不計嗎?

不,兩種方法之間肯定存在大小差異。

2)通常,這種通過將布爾值壓縮為單個字節來“優化”布爾值集合的方法是一個好主意嗎? 要么在嵌入式系統環境中,要么在其他方面。

通常是的,對標記進行建模的慣用方式是在無符號整數內進行按位操作。 根據所需標志的數量,您可以使用std::uint8_tstd::uint16_t等。

但是,最常見的建模方法不是通過索引,而是通過蒙版。

暫無
暫無

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

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