[英]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_t
, std::uint16_t
等。
但是,最常見的建模方法不是通過索引,而是通過蒙版。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.