Предполагая следующую таблицу в плоских буферах:
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).