【问题标题】:How to cut flat buffers vector size?如何削减平面缓冲区矢量大小?
【发布时间】:2020-10-30 14:59:59
【问题描述】:

我的架构是:

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);

【问题讨论】:

    标签: c++ serialization flatbuffers


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为您的问题与平面缓冲区的基本概念背道而驰:CreateUninitializedVector 已经在您的平面缓冲区中保留了一个 100 字节的空洞,并突破了分配边界。

      【讨论】:

      • 是的,我知道。但是,我可以更改偏移量和剪切矢量大小吗?没有基本问题,只需要重写最后一个索引和向量大小。可变类型可能吗?
      • 我没有在 flatbufferbuilder API 中看到类似的东西,没有。
      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2014-06-10
      相关资源
      最近更新 更多