0Pricing
C++ Academy · レッスン

スタック割り当て

自動記憶域の仕組みを理解します

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

自動記憶域

ローカル変数は自動記憶域に置かれ、一般にスタックと呼ばれます。実行がスコープに入ると作成され、スコープを出ると破棄されます。

#include <iostream>

int main() {
    int x = 42;          // on the stack
    double pi = 3.14;    // on the stack
    std::cout << x << " " << pi << "\n";
}

スタックは伸縮する

関数を呼び出すたびに、ローカル変数を保持するスタックフレームが積まれます。関数が戻るとフレームが取り除かれ、ローカル変数も消滅するため、手動での後処理は必要ありません。

#include <iostream>

void greet() {
    int local = 7;          // pushed on call
    std::cout << local << "\n";
}                            // popped on return

int main() { greet(); }

LIFO 順序

スタックは後入れ先出し(Last In, First Out)です。最後に作成されたローカル変数が、スコープの終了時に最初に破棄されます。

#include <iostream>

int main() {
    int a = 1;
    {
        int b = 2;   // created after a
        std::cout << b << "\n";
    }                // b destroyed first
    std::cout << a << "\n";
}

高速で低コスト

スタックへの割り当ては、スタックポインターを移動するだけなので非常に高速です。空きメモリを探す必要も、ヒープで必要になるような管理処理もありません。

スコープがライフタイムを決める

スタック上のオブジェクトが存在するのは、宣言されたブロック内だけです。ネストしたブロックには、それぞれ独自のスコープがあります。

#include <iostream>

int main() {
    for (int i = 0; i < 3; ++i) {
        int square = i * i;   // recreated each iteration
        std::cout << square << "\n";
    }
}

サイズには制限がある

スタックには固定された限られたサイズ(通常は数メガバイト)しかありません。スタック上に巨大な配列を割り当てると、スタックオーバーフローによるクラッシュが発生する可能性があります。

// Risky: a large fixed array on the stack
int big[1000000];   // may overflow the stack

スタックアドレスを返すのはバグ

ローカル変数へのポインターや参照を返してはいけません。関数が戻ると、その記憶域はなくなり、ポインターはダングリング状態になります。

int* bad() {
    int local = 5;
    return &local;   // BUG: local dies here
}

大きなオブジェクトは参照渡しする

大きなオブジェクトをスタックにコピーするのは非効率です。const& で渡せばコピーを避けながら、スタックの使用量を小さく抑えられます。

#include <string>

void print(const std::string& s) {  // no copy
    // use s
}

スタックオブジェクトに delete は不要

コンパイラがライフタイムを自動的に管理するため、スタック変数に対して 決して delete を呼び出してはいけません。

#include <iostream>

int main() {
    int n = 10;
    // delete &n;   // ERROR: not heap-allocated
    std::cout << n << "\n";
}

スタック上の配列

長さが既知の固定長配列はスタック上に置かれ、スコープが終了すると自動的に解放されます。

#include <iostream>

int main() {
    int values[3] = {10, 20, 30};
    for (int v : values) std::cout << v << "\n";
}

スタックを優先する場面

コンパイル時にサイズがわかっている、小さく短命なオブジェクトにはスタックを優先してください。スタックは高速で自動的に後片付けされるため、本当に必要な場合だけヒープを使います。

理解度チェック

スタック割り当てについての理解度を確認しましょう。

まとめ

スタック割り当てでは、スコープに紐づいた自動記憶域が使われ、変数はスコープに入ると作成され、LIFO順でスコープを抜けると破棄されることを学びました。高速で自動的に後片付けされますが、サイズには制限があります。ローカル変数のアドレスを返したり、スタックオブジェクトに delete を使ったりしてはいけません。

よくある質問

「スタック割り当て」レッスンは無料ですか?

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

「スタック割り当て」で何を学びますか?

自動記憶域の仕組みを理解します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「スタック割り当て」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. スタック割り当て
  2. new/deleteによるヒープ割り当て
  3. オブジェクトのライフタイム
  4. よくあるメモリバグ
← C++ Academyに戻る