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]
  • KIndexStrId [class]

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-06-07 (金) 20:27:34 (10d)