スタック割り当て
自動記憶域の仕組みを理解します
「スタック割り当て」は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フィードバックを取得できます。ローカル設定は不要です。