我最近一直在研究 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/