flatbufferc++:是否可以从flatbuffer::Vector中窃取

flatbuffer c++: Is it possible to steal from flatbuffers::Vector

本文关键字:Vector flatbuffer 是否 flatbufferc++      更新时间:2023-10-16

我是flatbuffer的新手,我想知道是否可以对flatbuffers::Vector中的数据进行完全(非常量(访问。看看下面的例子,我想窃取img2::mem::data的所有权,将其存储在Img-struct中,并以我想要的任何方式进行处理。在没有内存复制的情况下,这有可能吗?

    struct Img
    {
        int iXCount;
        int iYCount;
        int iXOffset;
        unsigned char *mem;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
        Img img;
        //init img;
        flatbuffers::FlatBufferBuilder fbb;
        auto mem = fbb.CreateVector(img.mem, img.iXOffset * img.iYCount);
        auto mloc = CreateImage(fbb, img.iXCount, img.iYCount, img.iXOffset, mem);
        fbb.Finish(mloc);
        //unpack
        auto img2 = flatbuffers::GetRoot<Image>(fbb.GetBufferPointer());
        const std::uint8_t*pMem = img2->mem()->data(); //unfortunately only const*
        return 0;
    }

pMem指向位于您正在使用的FlatBuffer中间某个位置的数据。因此,这意味着您可以访问它,但前提是您可以保留父缓冲区。

由于这些都是字节,您可以对它们进行const强制转换,并在不复制的情况下就地修改它们。请注意,如果您尝试使用非字节的东西,则必须注意FlatBuffer中的数据总是小端序。

除了const强制转换之外,您还可以使用--gen-mutable编译您的模式,这将为您提供额外的访问器来修改从GetMutableRoot开始的数据,而data((也将是非const。