正確なレイアウトのためのpacked struct
パディングなしでビットを配置します
「正確なレイアウトのためのpacked struct」はCoddyKit上の無料Zig Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはZig Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Zig Academyコースには全4レッスンが含まれています。
レイアウトが重要になる場面
ハードウェアレジスターやネットワークパケットのように、バイトを正確な形に配置する必要がある場合があります。そのときに活躍するのが packed struct です。
通常のStructはパディングを追加する
通常の struct では、Zigが速度のためにフィールドの順序を変更したりパディングを追加したりできます。そのため、メモリ上のサイズが各要素の合計より大きくなる場合があります。
const Plain = struct {
flag: bool,
value: u32,
};packed structを使う
packed struct と記述すると、Zigはパディングなしでフィールドを連続して格納します。宣言した順序も正確に維持されます。
const Tight = packed struct {
flag: bool,
value: u7,
};ビット単位でパックされる
packed struct はバイトではなくビットで測られます。上のフィールドは1 + 7ビットを使うため、ちょうど1バイトに収まります。
既知のバッキング整数
レイアウトが正確であるため、packed struct にはすべてのビットをまとめて保持する、保証されたバッキング整数型があります。
const Flags = packed struct {
a: bool,
b: bool,
rest: u6,
};整数に変換する
@bitCast を使うと、packed struct をバッキング整数に変換できます。これにより、加工されていない数値として保存したり送信したりできます。
const f = Flags{ .a = true, .b = false, .rest = 0 };
const bits: u8 = @bitCast(f);もう一度元に戻す
同じ @bitCast を使って、整数をpacked structに戻せます。生のビットが、使用可能な名前付きフィールドにデコードされます。
const raw: u8 = 0b0000_0001;
const f: Flags = @bitCast(raw);正確なサイズを確認する
@bitSizeOf を使うと、packed struct が期待どおりのビット数を正確に占有し、隠れたパディングがないことを確認できます。
const n = @bitSizeOf(Flags); // 8宣言順序がレイアウトになる
packed struct では、最初のフィールドが最下位ビットを占有します。順序がそのままレイアウトになるため、形式の要件どおりにフィールドを宣言してください。
プロトコルに最適
Packed struct はバイナリ形式にきれいに対応します。ハードウェアレジスターや通信パケットを、読みやすい名前付きフィールドとして記述できます。
知っておきたいトレードオフ
ビットパッキングでは、通常のStructよりフィールドアクセスが少し遅くなる場合があります。正確なレイアウトが本当に重要な場合だけ packed を使ってください。🧩
確認問題
packed struct は、そのフィールドについて何を保証しますか?
まとめ
packed struct は、パディングのない正確なビットレイアウトを提供し、バッキング整数を持ち、@bitCast で変換できることを学びました。バイナリ形式に最適です。🎉
AI チューターと学ぶ Zig — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「正確なレイアウトのためのpacked struct」レッスンは無料ですか?
はい。「正確なレイアウトのためのpacked struct」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Zig Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Zig Academyコースには全4レッスンが含まれています。
「正確なレイアウトのためのpacked struct」で何を学びますか?
パディングなしでビットを配置します ブラウザで直接実行するハンズオンコードでZig Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Zig Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのZig Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「正確なレイアウトのためのpacked struct」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このZig Academyレッスンでコードを書いて実行できますか?
はい。すべてのZig Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 正確なレイアウトのためのpacked struct
- u3のような任意ビット幅整数
- ビットフィールドとフラグ
- extern structとABIレイアウト