如何削减平面缓冲区矢量大小?

How to cut flat buffers vector size?

我的架构是:

table Object {
    data: [ubyte]
}

我有下一个代码:

flatbuffers::FlatBufferBuilder fb;
std::uint8_t* data = nullptr;
const size_t size = 100;
auto vector = fb.CreateUninitializedVector(size, sizeof (std::uint8_t), &data);
memset(data, 1, size);
auto object = CreateObject(fb, vector);
fb.Finish(object);

但是,我想创建比需要的更大的未初始化向量,并在发送之前削减向量大小,如下所示:

flatbuffers::FlatBufferBuilder fb;
std::uint8_t* data = nullptr;
const size_t reserved_size = 100;
auto vector = fb.CreateUninitializedVector(reserved_size, sizeof (std::uint8_t), &data);
const size_t real_size = 60;
memset(data, 1, real_size);
// How to cut vector size to real size?
auto object = CreateObject(fb, vector);
fb.Finish(object);

我认为你的要求违背了平面缓冲区的基本概念:CreateUninitializedVector 已经在你的平面缓冲区中预留了一个 100 字节的空洞并增加了分配边界。

目前 API 中没有这个功能,不,虽然可以为此添加一个功能,但这有点棘手,就像你已经指出的那样,只能这样做在创建向量之后(缓冲区前面 == 向量开始)。您可以在 FlatBuffers 存储库上打开一个 PR/issue 来实现它。

另一个问题是向量是“pre-aligned”,这意味着如果您指定 101 字节的原始大小,它可能会首先写入 3 个填充字节(取决于它之前的数据)。如果您随后将新大小指定为 100,则向量的开头将错位,这是不可能的。所以任何这样的函数都必须断言旧大小和新大小之间的差异是 4 的倍数(4 是向量之前的大小字段的大小)。