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

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

ただいまの
回答率

88.59%

メモリの確保について

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 401

masuter0413

score 49

ローカル変数はスタック領域に逆順に確保されていくのはなぜでしょうか。
また、c int main(){ hoge(); hoge1(); return 0; }
を実行したときのメモリの中の変化ですが、
まず、main関数の関数フレームがスタック領域にpushされ、つぎにhoge、つぎにhoge1がpushされる。hoge1の呼び出しが終了すると、hoge1をpop、つぎにhoge2,最後にmainをpopするという考えでよろしいでしょうか?FILO方式はこのことですか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • cateye

    2018/11/21 23:31 編集

    失礼、回答に入れました。

    キャンセル

回答 5

+2

C言語レベルで言うと処理系依存なので深く考えず、
「スタック領域があって、引数やローカル変数はそこに置かれる」程度の知識でいいと思います。


x86に限った話としては(私が他の処理系詳しくないだけですが)

関数の途中ではスタックフレームの開始地点はスタックに格納され、出すのに手間が掛かります。 そのため
ローカル変数のアドレスはベースポインタ-定数で表されます。
ベースポインタ-0よりベースポインタ-4の方が小さいので、結果として逆順に見えます。

呼び出しについては、呼び出し規約に依存しますが
提示されたソースの場合は引数がないので、概ね

  1. main関数のスタックフレームが作成される。
  2. hogeが呼び出される(return先として呼び出した次の位置がスタックに記憶される)
  3. hoge関数のスタックフレームが作成される
  4. hoge関数のスタックフレームが破棄される
  5. returnし、呼び出し位置が破棄される
  6. hoge1が呼び出される(return先として呼び出した次の位置がスタックに記憶される)
  7. hoge1関数のスタックフレームが作成される
  8. hoge1関数のスタックフレームが破棄される
  9. returnし、呼び出し位置が破棄される
  10. main関数のスタックフレームが破棄される

の流れです。

引数があった場合は、呼び出し規約に依存します。


余談ですが、FILOよりもLIFOの方が通り名として一般的です。
余談ついでですが、スタックの成長方向も処理系依存です。PA-RISCとやらはx86とは逆方向らしい

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

0

push, push, push, pop, pop, pop と利用するのがスタックで、
push, push, push, ... とし、先頭から読出すのが、キューですが?

FILO ... First In, Last Out ですから、その通りでしょう。

スタック構造を使えば、関数呼び出しが簡単にできるという事です。

[追記]
最近のCPUでは確認してませんが、、、スタック操作は専用命令があり、処理が楽。
スタックポインタ更新(減算)、スタックにデータを置く。
スタックを読出し、スタックポインタ更新(加算)。
スタックポインタからのオフセットアクセス。
それぞれが、一命令。

まあ、CPU依存ですが、Intelに関しては、x86互換が基本なので、変わらないと思います。

単にローカル変数をスタックじゃないところに置いても良いですが、スタックに置いた方が楽と思います。また、再帰関数なんて、スタックを使わずに実装するなんてどうすれば、良いのでしょうか。
(きっと方法はあると思うが、思いつかない)
また、ローカル変数をスタックに置くと、関数を抜ける時の後始末が楽というのがあります。(スタックポインタ操作だけ)

スタックとヒープですが、一つのメモリ領域を先頭(アドレスの小さい方)から、ヒープで、最後(アドレスの大きい方)から、スタックに割り当てるのが、昔の一般的割当て。(今も同じ?)

スタック領域に逆順に確保

これは処理系(コンパイラ)依存と思います。
コンパイラによっては、ローカル変数以外にも作業用の内部変数を使うものもあります。それらの変数は、ソースには無くても、スタック上に確保され、使われています。また、レジスタに割り当てられ、スタック上に領域が確保されない場合もあります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

逆順に確保

これは番地(アドレス)の大きい方からと言うことでしょうか?であれば、スタックは上位番地から下に向かって伸びていくからです。
スタック

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ローカル変数はスタック領域に逆順に確保されていくのはなぜでしょうか。

正解じゃないかもしれませんが、昔のコンピュータで、スタックオーバーフローを発生させてしまった際に他人のプログラムを壊してしまう可能性を減らしたかったからだと思います。
とりあえず、スタックを底において上方向に成長させれば壊すのは自分のプログラムだけで済みますしね。
現在もそのようになっているのは特に変える理由もないからだと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

ローカル変数はスタック領域に逆順に確保されていくのはなぜでしょうか。

CPUのスタックという仕組みがそうなってるから、です。
CPUのデータシートを読んでみたらどうでしょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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