BloGroonga

2023-03-28

第30回「grn_objの構造について」を開催しました!

第30回「grn_objの構造について」を開催しました!の内容をまとめました!

grn_objの構造について解説いただきました!

grn_objの構造

C言語は手続き型の言語で、その後オブジェクト指向という概念が出てきたので言語レベルではC言語はオブジェクト指向をサポートしていません。 C言語でオブジェクト指向的なことを実行できるようにしています。

どのように実現しているのでしょうか? C言語のメモリーレイアウトの考え方を使って実現しています。

例えば、継承(のような仕組み)を実現するには以下のようにします。

各オブジェクトで共通する内容を抽出して下記のような構造体を作ります。

typedef struct {
  int type;
} Animal;

上記を継承したデータを作るには以下のような構造体を作って実現します。

typedef struct {
  int type;
  char *name;
} Dog;

typedef struct {
  int type;
  char *job;
} Human;

上記のように定義すると、Dog型の構造体をAnimal型の構造体にキャストできます。 上記のように共通している情報を同じ位置に揃えることで、メモリー上のレイアウトも同じ位置に共通の情報が配置されるためです。

grn_objでもC言語の特徴を利用して以下のように、すべてのオブジェクトで共通する情報をgrn_obj_header型で保持します。 grn_obj_headerに自分がなんのオブジェクトなのかを表すメタデータが入っています。

struct _grn_obj {
  grn_obj_header header;
  union {
    struct {
      char *head;
      char *curr;
      char *tail;
    } b;
    struct {
      grn_obj *body;
      grn_section *sections;
      uint32_t n_sections;
    } v;
  } u;
};

また、unionを使っているのは容量を削減するためです。 grn_objの中にはGRN_BULKGRN_VECTORがあります。bBULKbvVECTORvuUNIONuです。 grn_objVECTORになるかもしれないし、BULKになるかもしれませんが、両方一気になることはないためUNIONで十分表現できるのでこの構造になっています。