Строгое правило псевдонимов ограничивает тип доступа к объекту (область памяти).В коде есть несколько мест, где правило может появиться: в пределах age()
и при вызове age()
.
В пределах age
необходимо учитывать object
.((person_t *)object)
является выражением lvalue, потому что оно имеет тип объекта и обозначает объект (область памяти).Тем не менее, ветвление достигается только при object->type == PERSON
, поэтому (предположительно) эффективный тип объекта равен person_t*
, следовательно, приведение не нарушает строгий псевдоним.В частности, строгий псевдоним позволяет:
- тип, совместимый с эффективным типом объекта,
При вызове age()
вы будетепредположительно передают object_t*
или тип, который происходит от object_t
: структура, которая имеет object_t
в качестве первого члена.Это допускается как:
- агрегатный или объединенный тип, включающий один из вышеупомянутых типов среди его членов
Кроме того, точка строгогоалиасинг позволяет оптимизировать загрузку значений в регистры.Если объект видоизменяется с помощью одного указателя, предполагается, что все, на что указывают указатели несовместимого типа, остается неизменным и, следовательно, не требует перезагрузки.Код ничего не меняет, поэтому оптимизация не должна влиять на него.