Я недавно просматривал библиотеку FlatBuffers. Я искал, чтобы оценить его для использования в моем проекте. Посмотрев на flatbuffers.h, Мне интересно, если есть нарушение правило строгого наложения и если это объясняет строгие псевдонимы, может кто-нибудь объяснить, как это происходит?
В предыдущих проектах я усвоил это правило сложным способом, оптимизация дает тонкие ошибки, которые трудно найти. Я использую размещение нового оператора чтобы избежать использования флагов компилятора для учета этого.
Ссылки:
В настоящее время чтение FlatBuffer полностью доступно только для чтения, поэтому компилятор не может предполагать псевдонимы указателей, и это не должно создавать никаких проблем.
Записать FlatBuffer, возможно, сложнее, но и здесь каждый кусочек памяти затрагивается только один раз одним указателем и никогда не возвращается обратно, за исключением сравнений vtable в EndTable()
(которые читаются memcmp()
).
Затем теоретически, если вы сначала создадите FlatBuffer, а затем сразу же прочитаете его, он может оптимизировать код написания и чтения и выполнить «злые» оптимизации, подобные тем, о которых говорил Линус в приведенной выше ссылке (притворяться, что запись никогда не происходила) ,
Код чистый w.r.t. -fstrict-aliasing -Wstrict-aliasing=3
Мало того что дает какие-то гарантии.
Если есть какой-то конкретный код, который, по вашему мнению, небезопасен, или у вас есть идеи о том, как лучше защитить от проблем с наложением (которые не являются -fno-strict-aliasing
:), я хотел бы услышать.