私はいくつかの C++ ネットワーク コードを見ていました。バッファの大きさを調べに行ったところ、次のようなことがわかりました。
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() 関数または 3 項演算子を使用して、これら 6 つの構造体のうち最大のものの正確なサイズを計算するものを期待します。私は上記のイディオムを見たことがなく、それが機能することを確信するために立ち止まる必要がありました。
私はこれに慣れていないので、一般的に、これがどれほど有効であり、それを行うことの利点と欠点は何かを知りたい.
私が見ることができるのは -
プロ:
- 構造体の最大サイズと少なくとも同じ大きさのサイズを常に提供する必要があります。スペースが限られていなければ、本当に必要なのはこれだけです。
- コンパイル時に計算できるようです。
- 非常に古い C++ (または C) コンパイラでも動作するはずです。
短所:
- 必要なサイズのほぼ 2 倍になる場合があります。
- これにより、人間がオフラインでバッファーの大きさを正確に把握することがはるかに困難になります。
- その奇妙な/予期しない。