c++ - FlatBuffers 是否以某种方式避免了严格的别名?

标签 c++ strict-aliasing flatbuffers

我最近一直在研究 FlatBuffers 库。我正在寻找评估它以用于我的项目。看着flatbuffers.h ,我想知道是否违反了strict-aliasing rule如果它确实考虑了严格的别名,有人可以解释它是如何做到的吗?

在以前的项目中,我很难学到这个规则,优化会产生难以发现的细微错误。我一直在使用 placement new operator避免使用编译器标志来解决这个问题。

链接:

最佳答案

目前,读取 FlatBuffer 完全是只读的事情,因此编译器可以假设没有指针别名,这应该不会产生任何问题。

写一个 FlatBuffer 可能更棘手,但在这里每 block 内存也只被一个指针触及一次,并且永远不会被读回,除了 EndTable() 中的 vtable 比较(它由 memcmp() 读取。

然后在理论上,如果您首先构建一个 FlatBuffer 然后立即读取它,它可以优化编写和读取代码,并进行 Linus 在您上面的链接中提到的那种“邪恶”优化(假装写作从未发生过)。

代码很干净 w.r.t. -fstrict-aliasing -Wstrict-aliasing=3,但不提供任何保证。

如果您觉得有任何代码特别不安全,或者对如何更好地防止别名问题有任何想法(不是 -fno-strict-aliasing :),我会喜欢听。

关于c++ - FlatBuffers 是否以某种方式避免了严格的别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330925/

相关文章:

c++ - 不使用模板时的编译错误[opencv]

c++ - 将 char[] 转换为 unsigned int 得到 : dereferencing type-punned pointer will break strict-aliasing rules

c - 严格的别名和覆盖继承

mysql - 创建 500.000 条记录的 FlatBuffers 的正确方法

c++ - 架构不固定时如何使用 FlatBuffers ?

c++ - 在同一个头文件中包含 guard 和 #pragma once

c++ - 在哪里声明这个记录器对象?

部分模板的 C++ typedef

c++ - 如何在 C++ 中获得没有 UB 的浮点位表示?

json - Flatbuffer 与 CBOR