C ++でビットフラグを格納するために列挙型を使用するのは少し面倒です。列挙型の値がORされると、列挙型が失われ、明示的なキャストなしでエラーが発生するためです。
この質問に対する受け入れられた答えは、|
演算子のオーバーロードを示唆しています。
FlagsSet operator|(FlagsSet a, FlagsSet b)
{
return FlagsSet(int(a) | int(b));
}
このメソッドに実行時の影響があるかどうか知りたいですか?
C ++でビットフラグを格納するために列挙型を使用するのは少し面倒です。列挙型の値がORされると、列挙型が失われ、明示的なキャストなしでエラーが発生するためです。
この質問に対する受け入れられた答えは、|
演算子のオーバーロードを示唆しています。
FlagsSet operator|(FlagsSet a, FlagsSet b)
{
return FlagsSet(int(a) | int(b));
}
このメソッドに実行時の影響があるかどうか知りたいですか?
正確性の観点からの実行時の影響?いいえ-これはまさにあなたが望むものでなければなりません。
速度の観点からの実行時の影響は?適切なコンパイラーは、これをリリースビルドの最小限の命令数に適切に最適化することを期待します(inline
念のために追加することもできます)。
RVO、レジスタ、および/またはインライン化の最適化を除いて、3つのコピーと関数呼び出しを実行する可能性があります。
裸のビットごとのOR演算自体は、通常、単一のプロセッサ命令に分解されます。
コードは正しいです。
コードは、型キャストなしの場合と同じ速度になります。
ただし、コードが高速であるかどうかは関係ありません。これは、「FlagSet」という名前の型が条件付きテスト(-> "if(Flag)")のコンテキストで使用される可能性が高いためです。これは、ビット単位よりも速度に大きな影響を及ぼします。レジスタのサイズの2つの値の「または」。
ビットフラグにstd::bitsetを使用します...はるかに単純です;)またはboost::dynamic_bitset。