Это будет сильно отличаться от компилятора к компилятору, так как разные компиляторы реализуют его с разными уровнями агрессии. GCC довольно агрессивен в этом отношении: включение строгого псевдонима заставит его думать, что указатели, которые «явно» эквивалентны человеку (например, foo *a; bar *b = (bar *) a;
), не могут создавать псевдонимы, что допускает некоторые очень агрессивные преобразования, но может явно нарушать Тщательно написанный код. По этой причине в Apple GCC по умолчанию отключен строгий псевдоним.
LLVM, напротив, даже не имеет строгого псевдонима , и, хотя это запланировано, разработчики заявили, что планируют реализовать его как запасной вариант, когда ничто другое не может судить об эквивалентности , В приведенном выше примере он все равно будет судить эквивалентные значения a и b. Он будет использовать псевдонимы только на основе типов, если не сможет определить их отношения каким-либо другим способом.
По моему опыту, влияние строгого псевдонима на производительность в основном связано с движением кода, инвариантного к циклу, где информация о типе может быть использована для доказательства того, что внутриконтурные загрузки не могут создавать псевдоним массива, который повторяется, что позволяет вытащил из петли. YMMV.