質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

ヒープとスタックの使い分けについて

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,231

hagitro

score 21

ヒープとスタックは、プログラム上に実装するにあたって、どう使い分けるのでしょうか。
(どちらか片方だけで構成されたプログラムはプログラムとして成立するのでしょうか。)

※当方はプログラマではありませんので、界隈の常識が理解出来ていません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2018/10/17 12:26

    何を実装するのでしょうか?ヒープやスタックを実装する話でしょうか?そうすると「使い分け」が意味をなさないのですが?あるいは、すでにあるヒープやスタックを使って何かを実装する話でしょうか?であれば「使い分け」が意味を持ちますが。

    キャンセル

  • hagitro

    2018/10/17 13:03

    otnさん、回答ありがとうございます。何を実装するか→何らかのプログラムを実装する話です。どんな用途のプログラムか→どんな用途のプログラムのときにヒープ(スタック)を使うのか、が根本の質問です。

    キャンセル

  • otn

    2018/10/17 14:44

    では、「何らかのプログラムを作成する際に、ヒープとスタックは、どう使い分けるのでしょうか。」が意味の通った質問になります。

    キャンセル

  • hagitro

    2018/10/23 10:09

    otnさん、ありがとうございます。おっしゃる通り、そういった理屈が理解出来ていない前提があるため、予め質問文にもコメント書きを入れております。

    キャンセル

回答 3

checkベストアンサー

+1

言語にも依るので、Cを想定して回答します。

スタック上の変数は、関数に入ったときに有効になり(作成され)、関数から出るときに、変数の存在が消えてしまいます(削除される)。

ヒープ上の変数は、プログラマが明示的に作成して、Cの場合だとプログラマが明示的に廃棄(削除)します。用済みになったのに廃棄し忘れるのが、「メモリリーク」というやつです。

なので、これらの性質を知った上で使い分けます。

これ以外に、グローバル変数(Cだとstatic変数も)があり、これはプログラムの実行開始時点で誕生して、プログラムの実行中はずっと存在し、プログラム終了と共に消えます。途中で削除は出来ません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:11

    ありがとうございます。とても良くわかりました。これぞ欲しかった回答です。

    キャンセル

0

確かに質問が意味不明って気もしますが、、、。

ヒープは、明示的に確保し、関数(メソッド)とかを抜けても有効。
スタックは、関数を抜ける時に開放されます。
それを理解して使うもの。

スタックだけでもプログラムは、作れますが、それが良いかどうかは状況次第。
スタックを使わないと言うのは、(今時のコンパイラでは)関数呼出しができないで可能かどうか? (関数を呼び出す際に、スタックに戻りアドレスが保存されます)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:15

    pepperleafさん、ご回答ありがとうございます。
    素人発想で恐縮ですが、ヒープを使う過程でスタックに一度データが入ったりするのでしょうか?

    キャンセル

-1

いまいち質門が意味不明ですが、
とりあえず、C言語の場合は、
ローカル変数はスタックに取られます。
グローバル変数やmalloc系の関数で確保されるメモリはヒープから取られますね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/23 10:18

    y_waiwaiさん、ご回答ありがとうございます。
    見たところローカル変数は使い物にならない低機能さを感じるのですが、プログラマの方は、主にグローバル関数ベースでプログラミングされることが多いのでしょうか。

    キャンセル

  • 2018/10/23 10:24

    ローカル変数は定義した関数内だけで使える変数です
    まあ、低機能に見えるでしょうけど、実際はグローバル変数より遥かに多くのローカル変数が使用されます
    主に、ローカル変数ベースでプログラミングされます

    キャンセル

  • 2018/11/13 09:10

    >主に、ローカル変数ベースでプログラミングされます
    勉強になりました。ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る