スタックとヒープについて調べていました。
メモリを以下のように4つの領域に分けられることを知りました。
- プログラム領域
- 静的領域
- ヒープ領域
- スタック領域
【参考】メモリの 4 領域
どこを見てそう思ったのか忘れてしまいましたが、上2つが「静的」、下2つが「動的」なメモリ領域だと認識していました。
また、以下のような説明を見つけました。
- コンパイル時に決まるものが「静的」
- 実行中に変化するものが「動的」
しかし、スタックとヒープの解説をしている記事に、
- スタックはコンパイル、リンクする時点でサイズは決まっている
【参考】ヒープとスタック | 学校では教えてくれないこと | [技術コラム集]組込みの門 | ユークエスト株式会社
と、ありました。
この時点で解釈に矛盾が生じるのですが、どこが間違っていますでしょうか。
どなたかご存知の方がいらっしゃればご教示願えませんでしょうか
よろしくおねがいします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
こんにちは。
スタックはコンパイル、リンクする時点でサイズは決まっている
この「サイズ」は「最大サイズ」です。実際に使っているサイズはプログラムの実行中に増減します。
なので「動的」なのですよ。
投稿2018/10/10 04:44
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/10 04:51
2018/10/10 05:00
2018/10/10 05:51
2018/10/10 06:08
2018/10/10 06:17
2018/10/10 06:34
2018/10/10 06:53
2018/10/10 07:11
0
あなたの言う動的、というのはどういうことでしょうか。
まずはそこらへんをはっきりさせる必要があります
サイズを動的に操作するのが動的、と定義するのであれば、スタックは静的なんでしょう。
しかし、内容を変化させるエリアを動的、とするなら、ヒープもスタックも動的、となります。
どっちでしょうか。
#まあ、普通はコード、CONSTは内容が変わらず(ROM)
#ヒープとスタックは、内容を変化させる、変化することができる(RAM)
#と、区別するもんですが
投稿2018/10/10 07:25
編集2018/10/10 13:42総合スコア88024
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/10/10 23:26
2018/10/10 23:30
退会済みユーザー
2018/10/10 23:36
2018/10/11 00:04
0
ベストアンサー
コンパイル時に決まるものが「静的」
実行中に変化するものが「動的」
ヒープとスタックは、コンパイル(&リンク)時に決まっているのになぜ、動的なのか? という疑問ですね。
確かに、ヒープ領域とスタック領域はコンパイル時に決まっています(OSによって若干の例外あり?)が、ヒープ領域とスタック領域に置かれるデータは、動的に配置されるという事です。
通常のプログラム(C とかのコンパイル言語を想定)で、「スタック領域の何番地」とか、「ヒープ領域の何番地」という指定をする事はありません。
data1 とか、text1 とかの変数を使用しますが、その変数が動的という事です。
C
1int ExtData; 2 3void test1() 4{ 5 int data1; 6 char text1[50]; 7 // ..... 8}
と言うCプログラムがあった場合、(通常) data1 と text1 は、スタック領域にデータが置かれ、そのアドレスは、関数 test1 が呼び出されるタイミングで、アドレスが異なります。 (こちらが動的) ヒープも同様。
これに対し、 関数の外側で宣言されている ExtData は、コンパイル(リンク)時に決まったアドレス(多分、BSS内)に置かれます。 (こちらが静的)
また、プログラム(コード)もコンパイル(リンク)時に置かれるアドレスが決まるので、静的となります。
コンパイル(リンク)時に置かれるアドレスが決まる → 静的
実行時に置かれるアドレスが決まる → 動的
で良いかと思います。
[追記]見出しの「スタック領域は動的か静的か」についての回答は、
--> スタック領域は、静的に確保される。スタック領域に置かれるデータは、動的に配置される。
ですね。
歴史的には、相対アドレスで動き、実行時にアドレスが決まるコードとかありますが、最近は主流じゃないですね。 また、インタープリタなども違うとかありますが。
それと、最近は仮想記憶で、以前ほどメモリ割り当ては厳しくない気もします。
問題なのは、参考にされたページの見出しにあるようにメモリとかが厳しい組込み系かと思います。
投稿2018/10/10 13:39
編集2018/10/10 13:48総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/10/10 23:43
2018/10/11 12:04 編集
0
参考にされた記事(ヒープとスタック)では、
プログラムやOSをコンパイル(リンク)した時点でセクションのアドレスとサイズが決まっていて、動作中にセクションのアドレスやサイズが変わることは無いんだ。これに対して、『ヒープ領域』や『スタック領域』は、プログラム中で一時的に使用するメモリのことで、普通はRAM上のどこかのセクションの一部に属することになる。
とあります。
「アドレスとサイズが決まっている」のはプログラムの事です。
ここで言うサイズはプログラムコードのサイズで、アドレスとはプログラムコード中のプログラムセクションの相対アドレスの事です。
投稿2018/10/10 03:24
編集2018/10/10 03:36総合スコア25300
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
矛盾は生じていないですよ。
スタックはコンパイル、リンクする時点でサイズは決まっている
「サイズは」決まっていると明確に書いてあります。内容は動的に変わります。
投稿2018/10/10 02:47
総合スコア6759
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。