Есть страница, которая описывает псевдоним очень подробно здесь .
Есть также несколько тем SO здесь и здесь .
Подводя итог, компилятор не может принять значение данных, когда два указателя разных типов обращаются к одному и тому же местоположению (т. Е. Он должен каждый раз читать значение и, следовательно, не может делать оптимизации).
Это происходит только тогда, когда строгий псевдоним не применяется. Строгий выбор псевдонимов:
- gcc: -flrict-aliasing [по умолчанию] и -fno-строго-aliasing
- MSVC:
Строгий псевдоним отключен по умолчанию.
(Если кто-то знает, как его включить,
скажите, пожалуйста.)
Пример
Скопируйте и вставьте этот код в main.c:
void f(unsigned u)
{
unsigned short* const bad = (unsigned short*)&u;
}
int main(void)
{
f(5);
return 0;
}
Затем скомпилируйте код с этими параметрами:
gcc main.c -Wall -O2
И вы получите:
main.c: 3:
предупреждение: разыменование типа-наказывается
указатель нарушит строгое-алиасинг
правила
Отключить алиасинг с помощью:
gcc main.c -fno-strict-aliasing
-Стена -O2
И предупреждение уходит. (Или просто вынуть -Wall, но ... не компилировать без него)
Как ни старайся, я не смог заставить MSVC предупредить меня.