В настоящее время меня интересует обоснование строгого правила псевдонимов. Я понимаю, что определенные псевдонимы не разрешены в C и что намерение состоит в том, чтобы разрешить оптимизацию, но я удивлен, что это было предпочтительным решением по сравнению с трассировкой приведения типов, когда был определен стандарт.
Итак, по-видимому, следующий пример нарушает строгое правило псевдонимов:
uint64_t swap(uint64_t val)
{
uint64_t copy = val;
uint32_t *ptr = (uint32_t*)© // strict aliasing violation
uint32_t tmp = ptr[0];
ptr[0] = ptr[1];
ptr[1] = tmp;
return copy;
}
Я могу ошибаться, но, насколько я понимаю, компилятор должен совершенно и тривиально уметь отслеживать приведения типов и избегать оптимизаций для типов, которые приводятся явно (точно так же, как он избегает такой оптимизации для указателей одного типа) на что угодно. вызывается с затронутыми значениями.
Итак, какие проблемы со строгим правилом алиасинга я пропустил, которые компилятор не может легко решить для автоматического обнаружения возможных оптимизаций)?
double
илиlong
, должны быть на 8-байтовой границе, чтобы ваш процесс не был убит с помощью чего-то вродеSIGBUS
? Технически это не является строгой проблемой псевдонимов, но затрагивает множество тех же основных проблем. - person Andrew Henle   schedule 28.12.2018uint64_t
почти по определению подходит дляuint32_t
@AndrewHenle, так что это точно не проблема. - person Antti Haapala   schedule 28.12.2018