2016-11-30 7 views
1

MIPSなどの多くのISAには、スタックの先頭を示す「スタックポインタ」というレジスタがあります。なぜ "ヒープポインタ"が登録されていないのですか?ヒープの上部がメモリに格納されますか?ヒープポインタレジスタ?

+1

"ヒープ"の概念は、(一般的に)CPUの上にあるステップを管理します。 CPUが存在していないと「ヒープポインタ」を持つ理由はありません。いくつかのシステムでは、それはまったく存在しないかもしれません。そのような場合、特定の範囲内のメモリしか持たず、自分で管理します。 –

答えて

2

「ヒープポインタ」が登録されていないのはなぜですか?

CPU命令がmallocでないため、「ヒープポインタ」レジスタはありません。

「スタックポインタ」レジスタがある理由は、x86上でcall,push、およびpopなど、スタックを直接操作するCPU命令があるためです。これらの命令は、一般的に、アーキテクチャスタックポインタレジスタの存在を要求する。

注:AFAIKでは、MIPSに関するこのような指示はありません。値をプッシュ/ポップするにはスタックポインタを自分で調整しなければなりません。また、 "呼び出し"はリンクレジスタに戻りアドレスを保存します。それでも、呼び出しスタックとローカル変数の概念は、メモリアクセスよりもはるかに高速であるため、レジスタはスタック位置を追跡するために使用されるほとんどの言語の中心にあります。

ヒープの先頭がメモリに格納されますか?

mallocの異なる実装がたくさんありますが、それらはすべてのみsizeのパラメータを取り、そこにはオプションではありませんが、mallocのためのグローバル変数の状態を維持します。

+1

Hmm ... 'store'のような命令では、通常RISC ISAの引数としてレジスタとメモリの場所をとりますが、メモリのアドレスはプログラムのメモリ空間の何でもかまいません - スタックかヒープ。だからこの意味で、ヒープを操作する命令もあります... – xri

+3

つまり、「ヒープ」はスタックではないからです。それは "トップ"または "ボトム"を持っていません。格納と検索の順序はありません。 –

+0

まあ、すべてのCPUの指示に沸騰する。しかし、アドレスに単語を書くだけでなく、ヒープを操作するのにはさらに多くのことがあります。メモリを割り当てることは、一般に、適切なサイズの空きブロックを見つけ、それを割り当て済みとしてマークし、実装固有のメタデータなどを更新する可能性が高いことを含む。これは単一のCPU命令であるにはあまりにも複雑すぎる。 –