第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_BULK
、GRN_VECTOR
があります。b
はBULK
のb
でv
はVECTOR
のv
でu
はUNION
のu
です。
grn_obj
はVECTOR
になるかもしれないし、BULK
になるかもしれませんが、両方一気になることはないためUNION
で十分表現できるのでこの構造になっています。