2

在不重新创建整个平面缓冲区的情况下使用 C++(非对象)API 时是否可以改变表数组?

这是我的架构示例

table Document {
  root_layer:Layer;
  bitmaps:[Bitmap];
  subdocuments:[Document];
}

table Layer {
  id:int;
  sublayers:[Layer];
}

...

这里有趣的部分是document → root_layer → sublayers

假设我想修改整个 sublayers 数组:完全重写它,而不仅仅是替换索引处的元素。据我所知,可变性 API 只允许替换索引处的元素,而不是用新数组替换整个数组,对吧?

今天我最终重新创建了整个文档,复制了原始文档中的所有字段,一旦我进入嵌套,sublayers我将其替换为新数组

有更好的方法吗?

4

1 回答 1

1

不,不是。

使用反射 API,可以将新表附加到现有缓冲区,然后调整向量的大小,例如sublayers,并使元素指向新(或旧)表。但是目前没有办法删除旧表,而且 API 使用起来非常痛苦,并且调整大小很慢(复杂平面结构的就地突变很难)。

或者,您可以从头开始创建一个新缓冲区,并且如果您不想为未修改的部分编写手动复制代码,您可以再次使用反射 API ( CopyTable) 或对象 API 来复制其余部分。

如果您发现您经常想要更改缓冲区的一部分而不是其余部分,也许.. 它们应该位于 2 个不同的缓冲区中?

如果由于某种原因静态数据必须与动态数据位于同一个缓冲区中,一种方法是将静态数据nested_flatbuffer放入memcpy.

恐怕平均而言,使用对象 API 是您最好的选择。

于 2018-05-28T20:48:15.637 回答