LoginSignup
11
11

More than 3 years have passed since last update.

スタック ヒープについて学んでみた

Last updated at Posted at 2020-01-19

※ 書き手はC言語のみ勉強している身の為,他言語での仕様は分かりかねます.また,実装時の環境で本記載も変わる為,自環境で一度確認することを推奨します.

メモリの種類について

名前 配置データ R/W 容量
プログラムメモリ 関数・定数 R 大サイズ
スタックメモリ
ローカル変数
R/W
小サイズ
静的メモリ 関数外変数 R/W 中サイズ
動的メモリ(ヒープメモリ) メモリ確保領域変数 R/W 大サイズ

主に4種類のメモリを活用する.
どれも一時的に使用するメモリで,通常RAMのどこかのセクションに一部に属する.

スタックメモリについて

  • スタックメモリが割り当てられる対象
    • プログラムの実行単位毎(タスクやスレッド)
    • タスクや関数内で宣言された変数やアドレス情報

もしタスクが終了されたり,関数から抜けるとこのスタックメモリの内容は破棄される.

下のような関数内の変数"a"はスタックメモリ上に保存されている事となる.

スタックメモリ例
void A(void){
  int a = 0;
}
  • サイズが決まるタイミング

    • プログラムがコンパイルまたはリンクされる時
  • スタックメモリを使うメリット

    • プログラムが組みやすい(メモリ確保領域を指定することなく,自動で確保してもらえるから)
  • スタックメモリ使用時に注意する事

    • 使用できるサイズが制限されている為,使い過ぎるとすぐ「スタック・オーバーフロー」となる.
    • 組み込み等,使用できるメモリが制限されている場合,ずっとスタックメモリで確保したものが残ってしまう事があるので,使用時には注意が必要

ヒープメモリについて

必要な時に動的に確保され,使い終わったら解放されるメモリ.
アプリケーションやOSで動的に確保される.

  • ヒープメモリが割り当てられる対象

    • malloc()関数で確保される領域.
  • ヒープメモリの解放方法

    • free()関数で解放される
  • サイズが決まるタイミング

    • メモリを確保する際に動的に決まる
  • ヒープメモリを使うメリット

    • 不必要にメモリを沢山使うことを防げる
  • ヒープメモリ使用時に注意する事

    • フラグメンテーション(メモリが虫食い状態で使われてしまう事)が発生しやすい

参考サイト

https://monozukuri-c.com/langc-stack-memory/
https://it-trend.jp/development_tools/article/32-0041

11
11
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11