Zig Academy · レッスン

正確なレイアウトのためのpacked struct

パディングなしでビットを配置します

レッスン 1/413 ステップ

「正確なレイアウトのための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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 正確なレイアウトのためのpacked struct
  2. u3のような任意ビット幅整数
  3. ビットフィールドとフラグ
  4. extern structとABIレイアウト
← Zig Academyに戻る