* kbcl0のページ#6 -(by [[K]],2019.06.06) ** (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) ---サイズsのメモリを確保する。 --void free(int s, void *p) ---メモリをkmallocに返す。この時サイズsを再度指定しなければいけないのが標準関数のfreeとの大きな相違点。 --void *realloc(int s0, int s1, void *q) ---旧サイズs0から新サイズs1へ変更する。 --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) ---可変長配列の末尾に1バイト追加する。 --int addInt(int i) ---可変長配列の末尾に4バイト追加する。 --void *addPtr(void *p) ---可変長配列の末尾に4バイト追加する。 --void addBytes(int s, const char *p) ---可変長配列の末尾にsバイトを追加する。 --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] -''KStringId'' [class] -''KIndexStrId'' [class] * こめんと欄 #comment