我最近一直在看 FlatBuffers 库。我想评估它以在我的项目中使用。在查看 flatbuffers.h 时,我想知道是否存在违反 strict-aliasing rule 的情况,如果它确实考虑了严格的别名,有人可以解释它是如何做到的吗?
在以前的项目中,我通过艰难的方式学到了这条规则,优化会产生难以发现的微妙错误。我一直在使用 placement new operator 来避免使用编译器标志来解决这个问题。
链接:
最佳答案
目前,读取 FlatBuffer 完全是只读的,所以编译器可以假设没有指针别名,这应该不会产生任何问题。
编写 FlatBuffer 可能更棘手,但这里的每个内存块也只被单个指针触及一次,并且永远不会被读回,除了 EndTable()
中的 vtable 比较(由 memcmp()
读取)。
然后从理论上讲,如果您首先构造一个 FlatBuffer 然后立即读取它,它可以优化编写和读取代码,并进行 Linus 在上面的链接中提到的那种“邪恶”优化(假装从未发生过写作) .
代码很干净 w.r.t. -fstrict-aliasing -Wstrict-aliasing=3
,并不是说提供任何保证。
如果您认为有任何代码特别不安全,或者对如何更好地防止别名问题(不是 -fno-strict-aliasing
:)有任何想法,我很乐意听到。