FlatBuffers 中的偏移大小是多少?

What is the offset size in FlatBuffers?

我们数据的主要部分是 strings,可能有子串重复(例如域 - “some.thing.com”和“thing.com”)。我们想通过 FlatBuffers 重用子字符串来减少文件大小和内存消耗,所以我打算使用 [string] 因为我可以只引用一些现有的子字符串,例如。 thing.com 只是一个用 let substr_offset = builder.create_string("thing.com") 创建的字符串,“some.thing.com” 将存储为 [builder.create_string("some."), substr_offset]

然而,引用似乎有成本,所以引用可能没有任何好处,因为字符串太短(小于偏移量变量大小)。这是对的吗?偏移类型只是 usize 吗? prefix/postfix 使用 FlatBuffers 的字符串表示有什么更好的选择?

PS。顺便说一句,什么是 string array 而不是 string 成本?只是多了一笔补偿费用吗?

根据 doc.

,偏移量似乎是 uint32(4 个字节,而不是 usize

字符串和向量都通过它们的 32 位偏移来寻址,并且还有一个 32 位大小的字段作为前缀。所以:

"some.thing.com" 14 chars + 1 terminator + 4 size bytes == 19.

或者:

"thing.com" 9 chars + 1 terminator + 4 size bytes == 14.
"some." 5 chars + 1 terminator + 4 size bytes == 10.
vector of 2 strings: 2x4 bytes of offsets + 4 size bytes = 12.

总数:36 在这 36 个中,有 14 个是共享的,留下 22 个字节的唯一数据,比原始数据大。因此,共享字符串需要 13 个字节或更大才能使这种技术值得,假设它经常共享。

详情:https://google.github.io/flatbuffers/flatbuffers_internals.html