これは強力なプロセッサ実装の詳細です。CLR とジッタは、プログラムから最高のパフォーマンスを得るためにデータ型が最適であることを確認するために、すでに多くの作業を行っています。たとえば、構造体が 34 ビットを占有するケースは決してありません。CLR 設計の選択により、最新のプロセッサで適切に機能する型の使用を開始できるようになっています。
構造体は最適になるようにレイアウトされており、データ型に応じた配置の選択が含まれます。たとえば、 int は常に 4 の倍数であるオフセットにアラインされます。これにより、プロセッサは int を簡単に読み取ることができます。ミスアラインされたバイトを int に多重化して戻す必要はなく、値がCPU キャッシュ ラインにまたがっており、複数のメモリ バス読み取りから一緒に接着する必要があります。一部のプロセッサ イベントは、読み取りと書き込みのミスアライメントを致命的なエラーとして扱います。これは、マシンに Itanium がない理由の 1 つです。
したがって、byte と int を持つ構造体がある場合、byte と int の間の 3 バイトを使用しない 8 バイトのデータ型になります。これらの未使用のバイトは、パディングと呼ばれます。また、構造体を配列に配置するときにアライメントが最適になるように、構造体の最後にパディングを入れることもできます。
1 つの変数をバイトとして宣言しても問題ありません。Intel/AMD プロセッサは、1 つの変数を 32 ビット int として読み書きするのに同じ時間を要します。ただし、短い使用は問題ありません。これには、cpu 命令 (サイズ オーバーライド プレフィックス) に余分なバイトが必要であり、余分な cpu サイクルがかかる可能性があります。実際には、整列規則のためにメモリを節約することはあまりありません。バイトを使用すると、別のバイトと組み合わせることができる場合にのみ何かが得られます。バイトの配列は問題ありません。複数のバイト メンバを持つ構造体も問題ありません。あなたの例はそうではありません。 intを宣言すると同様に機能します。
int より小さい型を使用すると、C# コードでは扱いにくい場合があります。MSIL コード モデルは int ベースです。+ や - などの基本的な演算子は、int 以上の型に対してのみ定義されており、小さい型の演算子はありません。そのため、キャストを使用して結果を切り捨てて小さなサイズに戻す必要があります。スイート スポットはintです。