プログラミング言語C – UNIXシステムインタフェース 記憶割り当て
津路です。
プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
8.7節に、記憶割り当てがあります。
ここでは、malloc プログラムが説明されています。
ページ227に以下の記述があります。
「mallocでは、文字数で表わされる要求サイズはヘッダ・サイズ単位で適当な数に繰り上げられる。割り当てられる実際のブロックはヘッダ自身のために1単位多くなる。これがヘッダのsizeフィールドに記憶される値である。」
mallocへの要求サイズは、文字数で表わされるのでしょうか。バイト数では?
ページ229には、以下の記述があります。
「関数morecoreは、OSからメモリを得るのに使われる。システムにメモリを要求することはかなり高価な処理であるから、mallocの呼び出しごとにそれをするのは損である。」
原語では、「asking the system for memory is comparatively expensive」ですので、「比較的高価な処理」です。
続けて、「したがって、morecoreでは要求は少なくともNALLOC単位にしている。より大きくなったこのブロックは必要ならば切り取られる。」
ここでNALLOCは、1kbyteです。後半の文がわかりずらいです。切り取られるの部分は、原文ではchopped upです。ここでは、「大きめに得られたこのブロックは、必要に応じて細分化される」といった意味だと思います。
「次にUNIXのシステム・コールsbrk(n)はメモリへ追加するnバイトへのポインタ(スペースがなければ-1)を返す。これは本来はNULLと設計すべきだったところである。」
原文では、「sbrk returns -1 if there was no space, even though NULL would have been a better design」ですので、後半の説明は、-1ではなくNULLとすべきだった、という意味です。
次に、morecore関数が記述されています。
#define NALLOC 1024 /* 要求する最少の単位数 */
/* morecore: システムにもっとメモリを要求する */
static Header *morecore(unsigned nu)
{
char *cp, *sbrk(int);
Header *up;
if(nu < NALLOC)
nu = NALLOc;
cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1) /* スペースが全然ない */
return NULL;
up = (Header *) cp;
up->s.size = nu;
free((void *)(up+1));
return freep;
}
NALLOCのコメントは変です。「要求する最小単位のバイト数」
morecoreのコメントも少し変です。「システムにより多くのメモリを要求する」
ではないでしょうか。