4

我最近一直在看 FlatBuffers 库。我正在评估它以在我的项目中使用。在查看flatbuffers.h时,我想知道是否违反了严格混叠规则,如果它确实解释了严格混叠,有人可以解释它是如何做到的吗?

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

链接:

4

1 回答 1

3

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

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

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

代码是干净的 wrt -fstrict-aliasing -Wstrict-aliasing=3,而不是提供任何保证。

如果您认为有任何代码特别不安全,或者对如何更好地防止混叠问题有任何想法(不是-fno-strict-aliasing:),我很想听听。

于 2014-06-25T17:59:33.873 回答