2
 #define ALLOCSIZE 10000 /* size of available space */

 static char allocbuf[ALLOCSIZE]; /* storage for alloc */
 static char *allocp = allocbuf; /* next free position */

 char *alloc(int n) /* return pointer to n characters */
 {
     if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
         allocp += n;
         return allocp - n; /* old p */
     } else /* not enough room */
           return 0;
 }

 void afree(char *p) /* free storage pointed to by p */
 {
     if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
         allocp = p;
 }

これまでのところ、メモリ割り当ての目的はプログラムの効率を維持することであると理解しています。配列 allocbuf を宣言すると、そのスペースがすべて占有され、目的が無効になるのではないでしょうか? 答えてくれた人に心から感謝します。

4

1 に答える 1

1

これらの関数は配列アロケータとして機能しますが、新しいメモリを使用する代わりに、静的セグメントにあり、通常の割り当てを必要としないこの大きな allocbuf を使用して再利用します。

によって解放されるのは最後に割り当てられたストレージのみであるため、これは LIFO ですが、これは、最後に割り当てられたストレージに対応するようafree()に指定する際にクライアント コードからの協力が必要です。p

あなたの質問のように、プログラムを使用するよりも静的セグメントから割り当てる方が高速newです。

于 2013-08-22T13:07:31.677 に答える