私は、1つまたは複数の真偽状態にある可能性のあるオブジェクトを持っている場合、プログラマがいくつかのブール値を使用するのではなく、フラグ+ビットマスクを頻繁に使用する理由を少し不明瞭にしてきました。一連のブール値ではなく、なぜフラグ+ビットマスクを使用するのですか?
これは.NETフレームワーク上にあります。必ずこれが最良の例ですが、.NETフレームワークには、次のを持っている場合ではない:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
だから、アンカースタイルを考えると、我々は選択された状態のどの把握するビットマスクを使用することができます。しかし、可能な値ごとにboolプロパティが定義されたAnchorStyleクラス/構造体、または個々の列挙型値の配列で同じことを達成できるようです。
もちろん私の質問の主な理由は、自分のコードで同様の習慣を守らなければならないかと思います。
なぜこのアプローチを使用しますか?
- メモリ消費量は少ないですか? (は、boolの配列/構造体より少なく消費するようなと思われます)
- 構造体または配列よりも優れたスタック/ヒープパフォーマンスですか?
- 比較操作が高速ですか?より速い値の追加/削除?
- これを書いた開発者にとって、より便利ですか?
強引な議論ではありませんが、メモリ消費は少なくなります。これはint(4バイト)を使い、各ブールは1バイトを使います。したがって、4つのboolは1つのintと同じものを使います。 32個のboolは32バイトを使いますが、すべてのboolは同じ列挙型になります。推奨されていないパスに行くと、enumは8バイト長(sizeof(long))にすることができます。 –
これを明確にしていただきありがとうございます。それは私にこのポストにつながった:http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte –
回答から、enumフラグは構造体よりも軽量であることは明らかです/ boolの配列はメモリの観点から見ています。しかし、BitVector32やBitArrayなど、.NET Frameworkのクラスがタスクに適しているようです。ストレージにBitVector32(uintでバックアップ)を使用し、特定のインデックスでビット(bool)を取得/設定するプロパティを提供する構造体はどうでしょうか? Windowsフォームはこれを行うようです。開発者向けのコードが増えましたが、パフォーマンスが優れているようで、カプセル化によって下流のAPIコンシューマーが使いやすくなりました。うん? –