flatbuffer c ++: возможно ли украсть у flatbuffers :: Vector

Я новичок в 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;
}

0

Решение

Ваш pMem указывает на данные, которые находятся где-то посередине используемого FlatBuffer. Таким образом, это означает, что вы можете получить к нему доступ, но только до тех пор, пока вы можете хранить родительский буфер.

Поскольку это байты, вы можете создать их и изменить на месте без копирования. Обратите внимание, что если вы когда-нибудь попробуете это с вещами, которые не являются байтами, вы должны знать, что данные в FlatBuffer всегда имеют порядок байтов.

В качестве альтернативы const-cast вы можете скомпилировать свою схему с помощью --gen-mutable, что даст вам дополнительные средства для изменения данных на месте, начиная с GetMutableRootи data () также будет неконстантным из этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]