Предполагая следующую таблицу в плоских буферах:
table Person {
id:int32
name:string;
age:int16;
location:string;
}
Тогда в коде С++ оба эти подхода верны?
//Calling CreateString inline
auto person = CreatePerson(builder,
10,
builder.CreateString(name),
25,
builder.CreateString("New York"));
против
auto name = builder.CreateString("John");
auto loc = builder.CreateString("New York");
auto person = CreatePerson(builder, 10, name, 25, loc);
Причина, по которой я спрашиваю, заключается в том, что мы должны создать все смещения перед созданием таблицы, но в документации четко не указано, приемлем ли встроенный вызов CreateString?
Если вызов builder.CreateString
не имеет какого-либо побочного эффекта, эти два варианта одинаковы. Требование вычисления всех смещений перед созданием таблицы выполняется в любом случае, поскольку C++ гарантирует, что все аргументы будут оценены до вызова функции.
Оба кода действительны. Порядок вычисления аргументов неважен. builder
просто сериализует отдельные значения в свободных местах массива байтов. CreatePerson(builder, 10, name, 25, loc)
копирует сериализованные данные из builder
.
Я не знаю плоских буферов, поэтому не знаю, является ли следование проблемой, но для «встроенного вызова» порядок оценки не гарантирован, поэтому
builder.CreateString("New York")
можно вызвать доbuilder.CreateString(name)
.