kbcl0のページ#6
(9) 主要関数一覧
- void kerrorExit(const char *s, ...)
- s以降をstderrにfprintfしてから、exit(EXIT_FAILURE)する。
- [memo] 単にエラー処理を1行減らすために用意したもの。
- void *kerrorExitP0(void *p, const char *s, ...)
- もしpが0でなければ、何もしないでpを返す。
- もしpが0ならs以降でkerrorExitする。
- [memo] 単にエラー処理をさらに1行減らすために用意したもの。ポインタで0を返したらエラーという仕様の関数は多いため。
- void kqsort(void *base, int num, int size, void *cmp, void *opt)
- int kpopCount32(unsigned int b)
- int kpopCount64(unsigned long long b)
- unsigned int kgetMsb32(unsigned int i)
- KPtrPool [class]
- KPtrPool(int s) [コンストラクタ]
- サイズsバイト専用のmalloc/free代用機構として初期化される。
- void *alloc()
- メモリをプールから取得する。プールが空の場合は、標準関数のmallocでプールを補充してから取得処理が行われる。
- void free(void *p)
- メモリをプールに返す。どんなにたくさん返されても、標準関数のfreeを使ってシステムにメモリを返すことはしない。すべてプールにため込まれて再利用を待つ。
- [memo] kclib1_0005での実験によると、KPtrPoolは標準関数のmalloc/freeに比べて18.5倍速くらいの速度が出る。
- KMalloc [class]
- void *alloc(int s)
- void free(int s, void *p)
- メモリをkmallocに返す。この時サイズsを再度指定しなければいけないのが標準関数のfreeとの大きな相違点。
- void *realloc(int s0, int s1, void *q)
- void report(FILE *fp)
- KMallocの利用状況をレポートする。デバッグ用。
- int inUse()
- KMallocが割り当て中のメモリの合計を返す。主にデバッグ用。
- [memo] 処理の前後でのinUse()の値の差を求めると、メモリリークにいち早く気付くことができて非常に重宝する。
- KPtrPool *ptrPool(int s)
- サイズsのメモリの管理を担当しているKPtrPoolへのポインタを返す。
- void ready()
- もしKMallocが未初期化であれば確実に初期化する。
- [memo] kmallocはKMallocクラスのオブジェクトで、グローバル変数として最初から用意されている。基本的にはこれ以外は使わない。
- [memo] KMallocはKPtrPoolを100個以上使って実装されている。kclib1_0005によると、KMallocは標準関数のmalloc/freeに比べて12.5倍速くらいの速度が出る。
- KSizPtr [class]
- 可変長配列を提供する。メンバ変数p、sを適宜参照してよい。sは現在のバイト数。pは確保領域の先頭アドレスで、計算の便宜を考えて char * 型にしてある。
- sを減らせば、いつでも配列の長さを低コストに減じることができる(残りのメモリは今後のサイズ次拡大のためのマージンとしてキープされる)。
- KSizPtr() [コンストラクタ]
- KSizPtr(int s1) [コンストラクタ]
- s1バイト分だけマージンを確保した状態で初期化する(もちろんそれでもs=0)。s1は2のベキでなければいけない。
- KSizPtr(KNoInit *ni) [コンストラクタ]
- あえて何も初期化しない。kmallocが利用可能ではない状況ではこうするしかない。主にstatic対応クラスを作るときに使う。niの値はダミーであり、一切参照されることはない。
- もちろん未初期化のままでいることは想定外になるので、できるだけ速やかに kmalloc.ready(); して、 new(this) KSizPtr; すべきである。
- void reset(int s1 = 0)
- 再初期化する。いったんすべて解放し、マージン領域も確保し直すことになる。
- void reserve(int s0)
- 必要に応じてマージン領域を広げて、サイズs0まではreallocなしで(=sを増やしていくだけで)アクセスできるようにする。この関数によってsの値は変化しない。
- void *reserve1(int s0)
- (s + s0)までreserveする。sもs0だけ増やされる。この関数はsを増加させる前の(p + s)を返す。
- void expand2()
- マージン域まで含めた総サイズが2倍になるようにマージン域を増やす。
- int addChar(int c)
- int addInt(int i)
- void *addPtr(void *p)
- void addBytes(int s, const char *p)
- void *insPtr(int i, void *p)
- 可変長配列の途中に4バイトを挿入する。挿入箇所はiで指定。iはバイト単位。
- void delPtr(int i)
- 可変長配列の途中を4バイト削除する。削除箇所はiで指定。iはバイト単位。
- void *getPtr(int i)
- 可変長配列の中のi番目のポインタを取得する。iはバイト単位ではなく要素単位。
- int vprintf(const char *f, va_list arg)
- vprintfした結果を可変長配列に追加する。サイズの自動伸長があることを除けばvsprintfと同等である。
- int printf(const char *f, ...)
- printfした結果を可変長配列に追加する。サイズの自動伸長があることを除けばsprintfと同等である。
- int addFile(const char *path, const char *mod, int flg)
- KAutoreleasePool [class]
- KAutoreleasePool() [コンストラクタ]
- KAutoreleasePool(KNoInit *ni) [コンストラクタ]
- あえて何も初期化しない。kmallocが利用可能ではない状況ではこうするしかない。主にstatic対応クラスを作るときに使う。niの値はダミーであり、一切参照されることはない。
- もちろん未初期化のままでいることは想定外になるので、できるだけ速やかに kmalloc.ready(); して、 new(this) KAutoreleasePool; すべきである。
- void add(int s, void *p, void *f, void *opt)
- プールにオブジェクトを登録する。fはデストラクタでoptはデストラクタにパラメータを渡したいときに使う。fやoptは省略できる。
- int del(void *p, void **pf = 0, void **po = 0)
- プールに登録済みのオブジェクトをプールから削除する。関数の返値はオブジェクトのバイト数。pfやpoが指定されているときは、登録時に指定されたfやoptを返す。
- int size(int *pn = 0)
- 現在プールに登録されているオブジェクトのサイズの合計を返す。pnを指定した場合は、オブジェクト数も取得できる。
- void *alloc(int s, void *f, void *opt)
- kmalloc.alloc(s)してからそのオブジェクトをプールに自動登録する。fやoptは省略可能。
- void flush()
- プールに登録されたオブジェクトをすべてkmalloc.free()する。それでプールは空になる。
- このメンバ関数を使わなくてもKAutoreleasePoolはデストラクトされるときにflushされるので、一つのプールを使いまわしたいとき以外は、このflushを使うことはない。
- void *kreadFileA(const char *path, const char *mod, int flg, int *psiz = 0)
- void *ksgetsA(void *ps, int *psiz = 0)
- char *kcutCrLfM(void *p, int s = -1)
- char *kextractA(const char *p, int s = -1)
- KIndexS [class]
- unsigned int kfnv32(void *p, int l)
- unsigned long long kfnv64(void *p, int l)
- KIndexHS [class]
- KIndexDict0 [class]
- KIndexDict3 [class]
- KBatchreleasePool [class]
- KIndexStrId [class]
こめんと欄
|