* 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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS