# Flatbuffers 學習篇
- 總目標: 自行解譯 tflite
- 由 c++/c/python 猜想 flatbuffer 內部實作
- 迷與思:
- 如何在 HW 加速, 將 memory 當 stack ?
- 思考 flatbuffer 自動化了哪些部分?
- 創造 json like 的 schema, 可以轉譯成類似 c/c++ header? 公用的 io streaming? 而非各類別所屬的 io streaming?
- 適合多語言轉譯內容? 都需要 schema?
- 能隨讀隨翻
- 每筆資料都要有長度?
- 具體的 type variable 可以, 甚至可以略過長度, 只給 type, 可查對應長度
- 但多種語言都可翻譯 flatbuffer, 想來仍是 [長度,值]
- 有效率的方式表達多筆同類資料
- array, list
- 可能是 array 長度, type 長度, 資料
- Enum
- 需要有 global index 嗎?
- Union
- 為了和 c/c++ 相容產生的資料型態
- 複雜結構
- 像自訂 class, 無法一開始知道長度. 如果仿 c/c++, 可用 pointer 解決.
- Schema 謎與思
- Schema 像 header 提供 class. 只有
- enum 會賦值
- default value
- Schema 對自訂結構, 有 struct 和 table. 差別?
- Schema 內看不到 length 或 size. 那在 binary 中為何?
-
- 參考 [官版入門教學](https://google.github.io/flatbuffers/flatbuffers_guide_tutorial.html)
## C++
- "monster_generated.h"
- 由 flac 建立 "monster_generated.h"
- 內有 #include "flabuffers/flatbuffers.h"
- Weapon 應是 "monster_generated.h"
- Schema 如何從建立 flatbuffer array?
- flatbuffers::Offset<Weapon> 可帶入 Weapon pointer
- 這 offset, 可想成是 pointer of Weapon
```
std::vector<flatbuffers::Offset<Weapon>> weapons_vector;
weapons_vector.push_back(sword);
weapons_vector.push_back(axe);
auto weapons = builder.CreateVector(weapons_vector);
```
- CreateVector() 與 CreateVectorOfStructus()
- 上述 CreateVector() 接收 vector< Weapon* >, vector 內有 size ...
- 而 CreateVectorOfStructs() 可接收 struct array, 但需提供 size.
```
Vec3 points[] = { Vec3(1.0f, 2.0f, 3.0f), Vec3(4.0f, 5.0f, 6.0f) };
auto path = builder.CreateVectorOfStructs(points, 2);
```
## C