Избегает ли FlatBuffers как-то строгого алиасинга?

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

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

Ссылки:


person Chap    schedule 20.06.2014    source источник


Ответы (1)


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

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

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

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

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

person Aardappel    schedule 25.06.2014