この文章は筆者の理解のために書かれたもので、内容の正しさは保証しない。
参考
- https://google.github.io/flatbuffers/flatbuffers_internals.html
- https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#flatbuffers-binary-format
バッファはroot tableで表される uoffset_t
から開始される。
現在の実装では、バッファを逆向きに構築する。
uoffset_t
- 基本は
uint32_t
- signedな
soffset_t
も存在する
- 基本は
voffset_t
uint16_t
その他のプリミティブ型は https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#primitives
Enumを定義した際に与えたunderlying typeとなる。
flatcでは、tableのenumフィールドにデフォルト値を与えると、そのフィールド値がデフォルト値の場合にvtableの値が0になるので注意(実装依存?)。
unionの値が設定されていないことを表すenum値である NONE
が予約されている。
型 | 説明 |
---|---|
enum representing the union choice | どの型が含まれているか |
uoffset_t | 実際の値へのオフセット |
- 親にインラインで格納されるのではなく そのアドレスからの オフセットで参照される
- 例: vectorが 0x38 に格納されており、そのデータが 0x0c ならば実データは 0x38 + 0x0c = 0x44 に格納される
- Stringsはbyte型のVectorsであり、常にnull終端である。
型 | 説明 |
---|---|
32bit element count | null終端を含まない要素数 |
scalar | 要素 |
... | ... |
- 自身がその親に直接格納される
- コンポーネントはそのサイズでアラインされる
- Structsは最大のスカラメンバーにアラインされる
- 定義順に値が格納される
- Structsとは異なり、親にインラインで格納されるのではなくオフセットで参照される
型 | 説明 |
---|---|
soffset_t | vtableへのオフセット。オブジェクトの開始位置から減算される |
scalar or uoffset_t | アラインされたフィールドの値。順序が決まっておらずすべてのフィールドが存在する必要はない。 |
... | ... |
フィールドへはvtableを用いてアクセスする。vtableの構造は以下の通り。
型 | 説明 |
---|---|
voffset_t | vtableのバイト単位のサイズ(この要素を含む)。バリデーションに使われる。 |
voffset_t | オブジェクトのサイズ(vtable offsetを含む) |
voffset_t | フィールドへのオフセット値。範囲外または0の場合は、フィールドの値が存在しないことを表す。 |
... | 上の要素がN個続く。Nはフィールド数。 |
- フィールドに初期値が設定されているときにvtableのその要素がスキップされる?