0Pricing
Swift Academy · レッスン

スタックとヒープ:値が存在する場所

構造体がスタックに、クラスがヒープに存在する仕組みと、パフォーマンスへの影響を学びます。

「スタックとヒープ:値が存在する場所」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ようこそ

Swift の値がメモリ上のどこに存在するのか、つまりスタックとヒープの違いを理解することは、高性能で予測しやすいコードを書くために不可欠です。

スタック

スタックは、自動的に管理される連続したメモリ領域です: • 関数のローカル変数とパラメーターがここに置かれます • 割り当ては O(1) です。ポインターを移動するだけだからです • スコープを抜けると自動的に解放されます • スレッドローカルです。各スレッドが独自のスタックを持ちます

ヒープ

ヒープは、長期間存続する割り当てに使われる共有メモリ領域です: • オブジェクトの寿命が1つのスコープを超える場合、ここに置かれます • 空きメモリを探す必要があるため、割り当てのコストが高くなります • クラスの場合は ARC によって管理されます • スレッド間で共有されるため、同期が必要です

構造体はスタックに置かれる

```swift func compute() { var pt = CGPoint(x: 3, y: 4) // on the stack pt.x += 1 } // pt freed automatically ``` 小さな構造体はコピーによって渡されるため、ヒープのオーバーヘッドはありません。

クラスはヒープに置かれる

```swift class Dog { var name: String init(name: String) { self.name = name } } var d = Dog(name: "Rex") // Dog instance on heap // 'd' is a pointer on the stack ```

大きな構造体はヒープを使うことがある

大きな構造体(配列、文字列、大きな値型)は、値型として振る舞う場合でも、内部では COW とヒープストレージを使用します: ```swift var arr = [Int](repeating: 0, count: 10_000) // The array's buffer is on the heap; 'arr' itself is a stack value ```

クロージャによるキャプチャ

クロージャが、スコープより長く存続する必要のある値型の変数をキャプチャすると、Swift はその変数をヒープ上のボックスに格納します: ```swift var count = 0 let increment = { count += 1 } // count captured in a heap box increment() print(count) // 1 ```

プロトコル存在型のボックス化

小さな値型を `any Protocol` 変数に格納すると、ヒープ割り当て(存在型ボックス化)が発生することがあります: ```swift var shape: any Shape = Circle(radius: 5) // may allocate on heap ``` 小さな型(3ワード以下)はインライン化され、大きな型はボックス化されます。

割り当ての測定

ヒープ割り当てを確認するには、Instruments の Allocations テンプレートを使います: 1. Profile > Allocations を選択します 2. クラスまたはカテゴリで絞り込みます 3. `alloc` と `dealloc` の回数を追跡します ループ内で `alloc` の回数が多い場合は、予期しないボックス化が発生していることがよくあります。

設計への影響

• 短期間だけ使うデータ保持型には構造体を優先します — スタックによる高速性 • 識別性や共有状態が必要な場合はクラスを使います • 高頻度のループ内での割り当てを避けます — `reserveCapacity` で事前に確保します • 最適化の前にプロファイリングを行います — 早すぎる最適化は時間を無駄にします

確認問題

関数のスコープを抜けたときに自動的に解放されるメモリの種類はどれですか?

まとめ

主なポイント: • スタック: 低コスト、自動管理、スレッドローカル、値型 • ヒープ: 柔軟、ARC 管理、参照型 • 大きな構造体は内部でヒープバッファを使用します(COW) • 変数をキャプチャするクロージャは、その変数をヒープ上でボックス化します • Instruments の Allocations を使って、予期しないヒープ負荷を検出します 次は、変更、共有、予期しないエイリアシングです。

よくある質問

「スタックとヒープ:値が存在する場所」レッスンは無料ですか?

はい。「スタックとヒープ:値が存在する場所」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「スタックとヒープ:値が存在する場所」で何を学びますか?

構造体がスタックに、クラスがヒープに存在する仕組みと、パフォーマンスへの影響を学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「スタックとヒープ:値が存在する場所」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. スタックとヒープ:値が存在する場所
  2. 変更、共有、予期しないエイリアシング
  3. 値と参照が混在するグラフ
  4. 値セマンティクスに対応したAPI設計
← Swift Academyに戻る