私はいくつかのC++ネットワーキングコードを見ていました。 バッファサイジングのためにstd :: maxの代わりにbitwiseを使う
static const uint32_t MAX_COMMAND_BUFFER =
sizeof(struct S1) | sizeof(struct S2) | sizeof(struct S3) |
sizeof(struct S4) | sizeof(struct S5) | sizeof(struct S6);
は、私がここでの基本的な考え方は、バッファは、これらの6つの構造体のいずれか含めることができるということであると考えている:私は、バッファがいかに大きな調べるために行ったとき、私はこのようなものを見つけました。これは外部スコープで宣言されているため、後で外部スコープの
uint8_t
配列サイズなどのもので使用できます。
今ここでは、std :: max()関数、またはこれらの6つの構造体のうちの最大サイズの正確なサイズを計算するための3次演算子のいずれかを使用することが期待されます。私は前に上記のイディオムを見たことがないし、それが機能すると自分自身を説得するために停止する必要がありました。
私はこれを初めて勉強して以来、私は一般的にどのように有効であるかを知りたいと思っています。それを行う利点と欠点は何ですか?
私が見ることができることである -
プロ:
- それは常にあなたの最大の構造体のサイズと同じ大きさのサイズ少なくともを与える必要があります。スペースが割高でない場合は、本当に必要なのはどれだけですか。
- コンパイル時に計算可能に見えます。
- 非常に古いC++(またはC)コンパイラでも動作するはずです。
詐欺:
- これは、必要に応じて大きさがほぼ2倍の大きさにすることがあります。
- これは、人間がバッファの大きさを正確にオフラインで把握することをはるかに困難にします。
- その奇妙な/予期しない。
は、コードがために書かれたもの、コンパイラによっては、特にコンパイラ以来、最適化されている可能性があります。 – refi64