H25秋期午後のプログラミング

T.S.さん  
(No.1)
空欄キについてですが、
p->sizeq->sizer->sizeの3種類を使っているはずなのですが、
答えは「p->size+q->size+r->size+3*HSIZE」でないのはなぜでしょうか?
ご回答お願いします。

URL : https://www.ap-siken.com/kakomon/25_aki/pm02.html
2019.04.04 21:33
べにゃめさん 
(No.2)
まず前提として、[X]->sizeはメモリブロック[X]の「データ部分のサイズ」を表し、
HSIZEは各メモリブロックの「ヘッダ部分のサイズ」を表していることは理解していると思います。

問題で求めるべき「p->size」は生成される空ブロックの「データ部分のサイズ」です。
「p->size + q->size + r->size + 3*HSIZE」は全体のサイズであり、
これは新メモリブロックpのヘッダも含んでいます。なので、HSIZEを引かなければなりません。
2019.04.04 22:15
助け人さん 
AP ゴールドマイスター
(No.3)
横から失礼します。

空欄キの後に、後が割当て済みで二つを合体するケースがあり、
p->size ← p->size + q->size + HSIZE
となっているのを参考にするといいです。

空欄キは、三つを合体するケースであり、p->size + q->size + r->sizeに、あと何個分のHSIZEを加えるかがポイントです。

二つを合体するケースで1個分のHSIZEを加えるなら、三つを合体するケースで3個分ではなく2個分のHSIZEを加えるのが自然である、という考え方ができます。このように、違う角度からも考えれば、ミスを防げます。
2019.04.04 22:36
T.S.さん  
(No.4)
お二方ご回答ありがとうございます。
もう一つ質問があります。
設問3の(3)の公式解答では「メモリブロックの先頭アドレスが変わるから」とあるのですが、
先頭以外のメモリブロックのアドレスが変わっても問題ないのでしょうか?
2019.04.06 12:51
べにゃめさん 
(No.5)
「先頭以外のメモリブロックのアドレス」について分かりかねます。
そのため以降の解説は十分な手助けにならないかもしれません。

始めに確認したいのですが、「先頭アドレス」とは各メモリブロックが存在する領域の、文字通り先頭を示すアドレスです。メモリブロック毎に先頭アドレスは存在します。

一つのメモリブロックは離散するものではなく、ヘッダ部分からデータ部分まで連続しています。
メモリブロックの先頭アドレスがわかれば、その相対位置からメモリブロックの各種メンバを特定することができます。
逆に別の場所に先頭アドレスを記憶しておきながら、勝手にメモリブロックがアドレスを変えると、
記憶していた先頭アドレスからメモリブロックへアクセスすることができなくなります。
これが問題文で言われている内容になります。
2019.04.06 16:41
助け人さん 
AP ゴールドマイスター
(No.6)
図6には、6つのメモリブロックがあり、順に①・・・⑥とします。この状態でメモリコンパクションを行うと、②④⑥の後に、①③⑤の合体が続きます。

もし、②④⑥のいずれかが解放されると、割当て時の引数が解放時の引数として使えないということです。解答例の「メモリブロックの先頭アドレス」とは、解放される②④⑥のいずれかのメモリブロックの先頭アドレスのことです。

ご質問の「先頭以外のメモリブロックのアドレスが変わっても問題ないのでしょうか?」の主旨がよくわかりませんが、先頭のメモリブロックとか、先頭以外のメモリブロックではなく、メモリブロックの先頭アドレスとは、問題文に何度も登場しているように、各メモリブロックが始まっているアドレスのことです。
2019.04.06 16:44
T.S.さん  
(No.7)
お二方ともご回答ありがとうございます。
「メモリブロックの先頭アドレス」はヒープ領域内の最初のブロックだと思っていました。
正しくはメモリブロックの始まりのアドレスということですね。
2019.04.06 20:25

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop