Ответ 1
Существует страница, в которой описывается сглаживание очень тщательно здесь.
Здесь также есть некоторые темы здесь и здесь.
Подводя итог, компилятор не может принять значение данных, когда два указателя разных типов обращаются к одному и тому же местоположению (т.е. он должен каждый раз считывать значение и, следовательно, не может делать оптимизации).
Это происходит только тогда, когда строгое сглаживание не выполняется. Строгие варианты сглаживания:
- gcc: -fstrict-aliasing [default] и -fno-strict-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 -Wall -O2
И предупреждение уходит. (Или просто вытащите -Wall, но... не компилируйте без него)
Попробуйте, чтобы я не мог заставить MSVC дать мне предупреждение.