【发布时间】:2020-05-13 04:18:51
【问题描述】:
最近我尝试在 C++ 中使用FlatBuffers。我发现 FlatBuffers 似乎使用了很多类型双关语,比如 C++ 中的 reinterpret_cast。这让我有点不舒服,因为我学会了it's undefined behavior in many cases。
例如Rect 在 fbs 文件中:
struct Rect {
left:int;
top:int;
right:int;
bottom:int;
}
变成这个 C++ 代码以便从表中读取它:
const xxxxx::Rect *position() const {
return GetStruct<const xxxxx::Rect *>(VT_POSITION);
}
而the definition of GetStruct 只是使用 reinterpret_cast。
我的问题是:
- 这真的是 C++ 中未定义的行为吗?
- 在实践中,这种用法真的会有问题吗?
更新:
缓冲区可以来自网络或磁盘。如果缓冲区实际上来自同一个 C++ 程序的编写者编写的同一个内存,我不知道是否不同。
但是作者自动生成的方法是:
void add_position(const xxxxx::Rect *position) {
fbb_.AddStruct(Char::VT_POSITION, position);
}
这将使用this method 和this method,因此也使用reinterpret_cast。
【问题讨论】:
-
这在一定程度上取决于
VT_POSITION的定义以及那里的数据是如何到达那里的。 -
@1201ProgramAlarm
VT_POSITION是一个自动生成的枚举常量,我认为它就像一个偏移量: enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_POSITION = 4, VT_CANDIDATE = 6 }; -
根据发布的代码无法回答。如果该类型的对象存在于该位置,则该代码将是有效的。
-
@M.M 我只是想询问通常的 FlatBuffers 使用情况,比如从网络或磁盘读取缓冲区。
标签: c++ flatbuffers