From katsu@sranhk.sra.co.jp Tue Mar 13 13:26:26 2001 Path: news2.sra.co.jp!not-for-mail From: WATANABE Katsuhiro Newsgroups: fj.comp.lang.c Subject: Re: Guidelines for programming education (Re: freeing is not...) Date: 13 Mar 2001 13:25:02 +0900 Organization: Software Research Associates, Inc., Japan Lines: 51 Message-ID: References: <890or7$jo8@utogw.gssm.otsuka.tsukuba.ac.jp> NNTP-Posting-Host: sranhk.sra.co.jp Mime-Version: 1.0 (generated by tm-edit 7.106) Content-Type: text/plain; charset=ISO-2022-JP X-Trace: sranhh.sra.co.jp 984457508 27617 133.137.36.134 (13 Mar 2001 04:25:08 GMT) X-Complaints-To: news@sra.co.jp NNTP-Posting-Date: 13 Mar 2001 04:25:08 GMT X-Newsreader: Gnus v5.3/Emacs 19.34 Xref: news2.sra.co.jp fj.comp.lang.c:12696 あまりの follow-up の遅さが議論の妨げになっていたらごめんなさい。 23 Feb 2000 の記事 で 前田敦司 MAEDA Atusi さんいはく > kuno@gssm.otsuka.tsukuba.ac.jp writes: > > > > やっぱりfree()じゃなくって、reclaim()とか、garbage_collect_this_area() > > > とか、insert_into_memory_pool()とかの名前に変えた方がいいんじゃないか > > > と思いはじめました:-)。 > > > > そして自分では「何もしない」unmalloc()を呼ぶと :-) 久野 > > そうかっ。 再利用する必要が生じるまでfree()しないfree()を書けば良いのだ! > > static void *free_buf[FREE_SIZE]; > static int num_free; > > void *my_malloc(size_t size) > { > while (num_free > 0) { > free(free_buf[--num_free]); > } > return malloc(size); > } > void my_free(void *ptr) > { > if (num_free < FREE_SIZE) { > free_buf[num_free++] = ptr; > } else { > free(ptr); > } > } > > exit()時にfree()したい人がfree()しても、FREE_SIZEをたっぷりとっとけば > 実際には全くfree()せずにすむ! いや、配列に入れずに線形リストでつなげば、 > いくらfree()しても大丈夫だ! (←バカ) 多分バカじゃありません。これは、論文 "Dynamic Storage Allocation: A Survey and Critical Review" Paul R. Wilson, Mark S. Johnstone, Michael Neely, and David Boles Proc. 1995 Intl. Workshop on Memory Management (IWMM'95), LNCS 986 (ftp://ftp.cs.utexas.edu/pub/garbage/allocsurv.ps) の中で "Deferred Reuse" と名づけられている、真面目な技巧かと思います。 locality と fragmentation に関して、ある種効果ありと述べられています。 詳しくは 2.5 章 Deferred Coalescing and Deferred Reuse をご参照あれ。 実はこの論文を過去に fj に紹介したのは前田さんご自身なんですよ。:-) -- 渡邊克宏@SRA オープンソースビジネス部