libdatastructにパッチ送った
送ったのは何日か前だけど作者のブログでも取り上げてもらったのがうれしかったので。
libdatastructというのはid:pi8027さんのライブラリ。
- Associative array
- stack
- queue
- double-ended queue (deque)
といういろいろ便利なデータ構造を扱える優れもの。
で、そのlibdatastructのstackだけ使ってみてちょっと気付いたことがあって、パッチ書いてみた。
修正した点は
- memcpyでコピーしてるので、構造体にポインタが含まれていた場合にアドレスをコピーしてしまうのでコピー用の関数をstack_initialize()がとるようにした
と、あと
- 解放時に現在のサイズまでの要素を解放するが、現在のサイズの位置をpop時に戻して(減少させて)メモリの解放はしないようにしてたので、「一番後ろのまだ解放してない要素数」をメンバに追加
とか。あといろいろ。
...でもid:pi8027さんも言っているようにいちいちコピーしてしまうと計算コストを上げてしまうし、特にデータを参照するだけでもコピーが発生して、いちいち呼び出し元でfree()しなくちゃならなくなる...orz
実は俺(ブログでは俺か僕か未だに統一できてない...)もかなりこれはうざったいと感じていたりしたw
でもコピーしないとデータが間違って表示されたりSEGVったりするし...
参照の場合はコピーを発生させないようにポインタを利用者に渡すのが「C的な」一番いい妥協点かもしれないけど、スタック上の値をそのまま操作できちゃうなどの問題がでてきてそれなら今のままでいんじゃね?とか途中思ったけどつい手がすべって(嘘)send requestを押した。反省している。
で、エントリでid:pi8027さんがGC導入するのがよくねと言った。
正直GCは最近調べ始めたのでまったく分かってない。
「プログラミング言語を作る」って本(まぁWeb版あるけど...)にGCの章があったけどへーとか分かったフリしてた。
でもCも今後使うからにはやっぱGCとかメモリ管理のこと知っといた方がいいよね...と思ってるのでいつかやりたい。いつか。ブクマとかもしてるし。読んでないけど。