在 Win32 環境下,BOOL 實際是 typedef int BOOL,佔用 4 字節。若類中定義 8 個 BOOL 成員,將消耗 32 字節。對於大量實例化的對象,這造成可觀的內存浪費。
C++ 支持位域,可將整型成員限制為指定比特寬度。將 BOOL 成員聲明為 1 位:
class CMyClass {
BOOL m_bVar1 : 1;
BOOL m_bVar2 : 1;
BOOL m_bVar3 : 1;
BOOL m_bVar4 : 1;
BOOL m_bVar5 : 1;
BOOL m_bVar6 : 1;
BOOL m_bVar7 : 1;
BOOL m_bVar8 : 1;
// ... 其他成員
};
8 個標誌位僅佔用 1 字節,內存壓縮 32 倍。
int 或 unsigned int)。| 指標 | 普通 BOOL (int) | 位域 BOOL :1 |
|---|---|---|
| 內存佔用 | 4 字節/變量 | 1 位/變量(打包後 ~1 字節/8變量) |
| 讀寫速度 | 直接內存訪問,最快 | 需位運算(AND/OR/SHIFT),額外 CPU 開銷 |
| 原子性 | 天然原子(單指令) | 非原子,多線程需額外同步 |
| 調試便利性 | 直接查看值 | 調試器可能顯示打包後的整數 |
unsigned int 或 uint32_t 作為底層類型,明確無符號語義;集中定義標誌位枚舉,配合內聯封裝函數提升可讀性。// C++11 std::bitset 固定大小標誌集
#include <bitset>
class Flags {
std::bitset<32> bits_;
public:
void setFlag(size_t pos) { bits_.set(pos); }
bool testFlag(size_t pos) const { return bits_.test(pos); }
};
// C++20 std::atomic_flag / 原子位操作(多線程安全)
// 或使用 boost::dynamic_bitset 動態大小
std::bitset 提供編譯期大小固定、無運行期開銷、豐富位操作接口,是現代 C++ 首選;位域仍適用於與硬件/協議交互的底層代碼。