FlatBuffers创建表时能否内联调用CreateString?
FlatBuffers两种创建Person表的写法是否都合规?
首先给出FlatBuffers中的Person表定义:
table Person { id:int32; name:string; age:int16; location:string; }
针对这个表定义,以下两种C++实现方式是否都正确?
方式一:内联调用CreateString
// 内联调用CreateString 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);
两种写法都是完全合规且正确的。
FlatBuffers的核心规则是「在创建表之前,必须先完成所有嵌套对象或字符串的构建」,而内联调用builder.CreateString()的本质是:在调用CreatePerson()之前,就已经执行了字符串的创建逻辑,生成了对应的偏移量,完全符合先构建嵌套元素再创建表的要求。
builder.CreateString()会立即将字符串数据写入FlatBuffer的缓冲区,并返回对应的偏移值。不管是把偏移值先存入变量,还是直接作为参数传入CreatePerson(),底层执行顺序都是先创建所有字符串,再创建Person表,最终生成的FlatBuffer数据完全一致。
内容的提问来源于stack exchange,提问作者tunafish24
相关产品推荐
相关产品推荐

