FlatBuffers как-то избегают строгого наложения имен?

Я недавно просматривал библиотеку FlatBuffers. Я искал, чтобы оценить его для использования в моем проекте. Посмотрев на flatbuffers.h, Мне интересно, если есть нарушение правило строгого наложения и если это объясняет строгие псевдонимы, может кто-нибудь объяснить, как это происходит?

В предыдущих проектах я усвоил это правило сложным способом, оптимизация дает тонкие ошибки, которые трудно найти. Я использую размещение нового оператора чтобы избежать использования флагов компилятора для учета этого.

Ссылки:

4

Решение

В настоящее время чтение FlatBuffer полностью доступно только для чтения, поэтому компилятор не может предполагать псевдонимы указателей, и это не должно создавать никаких проблем.

Записать FlatBuffer, возможно, сложнее, но и здесь каждый кусочек памяти затрагивается только один раз одним указателем и никогда не возвращается обратно, за исключением сравнений vtable в EndTable() (которые читаются memcmp()).

Затем теоретически, если вы сначала создадите FlatBuffer, а затем сразу же прочитаете его, он может оптимизировать код написания и чтения и выполнить «злые» оптимизации, подобные тем, о которых говорил Линус в приведенной выше ссылке (притворяться, что запись никогда не происходила) ,

Код чистый w.r.t. -fstrict-aliasing -Wstrict-aliasing=3Мало того что дает какие-то гарантии.

Если есть какой-то конкретный код, который, по вашему мнению, небезопасен, или у вас есть идеи о том, как лучше защитить от проблем с наложением (которые не являются -fno-strict-aliasing :), я хотел бы услышать.

3

Другие решения


По вопросам рекламы [email protected]