gpt4 book ai didi

flatbuffers - 使用 flatbuffers 结构作为键

转载 作者:行者123 更新时间:2023-12-04 17:33:44 25 4
gpt4 key购买 nike

我正在考虑使用 flatbuffers 的序列化 struct 作为键值存储中的键。这是我想在 rocksdb 中用作键的 struct 示例。

struct Foo {
foo_id: int64;
foo_type: int32;
}

我阅读了文档并认为 struct 的布局是确定性的。这是否意味着它适合用作 key ?如果是,我如何序列化一个 struct 并将其反序列化。似乎 Table 有用于序列化/反序列化的 API,但 struct 没有(?)。

我尝试序列化 struct 如下:

constexpr int key_size = sizeof(Foo);
using FooKey = std::array<char, key_size>;

FooKey get_foo_key(const Foo& foo_object) {
FooKey key;
std::memcpy(&key, &foo_object, key_size);
return key;
}

const Foo* get_foo(const FooKey& key) {
return reinterpret_cast<const Foo*>(&key);
}

我做了一些健全性检查,上面的内容似乎在我的 Ubuntu 18 docker 镜像中有效,而且速度非常快。所以我的问题如下:

  1. 如果机器通过了 FLATBUFFERS_LITTLEENDIAN 和 uint8/char 等价性检查,那么在机器上这样做是否安全?或者还需要其他检查吗?

  2. 在执行上述操作时,是否还有我应该注意的任何其他注意事项?

提前致谢!

最佳答案

你实际上不需要通过 std::arrayFoo 结构已经是一 block 内存,可以按照你的意愿安全地复制或转换.它不需要序列化函数。

正如您所说,该内存包含小端数据,因此 FLATBUFFERS_LITTLEENDIAN 必须通过。实际上,即使在大端机器上,您也可以复制所有您想要的结构,只要您使用访问器读取字段(在大端上访问时进行字节交换)。唯一不能在大端上工作的是将结构强制转换为 int64_t * 以在不使用访问器方法的情况下读取第一个字段。

对某些转换操作的另一个警告是严格的别名,如果你打开了某些转换可能是未定义的行为。

另请注意,在此示例中,由于对齐原因,Foo 在所有平台上的大小均为 16 字节。

关于flatbuffers - 使用 flatbuffers 结构作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com