Авторы Стандарта C хотели позволить авторам компилятора генерировать эффективный код в обстоятельствах, когда это было бы теоретически возможно, но маловероятно, что глобальная переменная могла бы получить доступ к своему значению, используя, казалось бы, не связанный указатель.Идея состояла не в том, чтобы запретить наложение типов путем приведения и разыменования указателя в одном выражении, а в том, чтобы сказать, что с учетом чего-то вроде:
int x;
int foo(double *d)
{
x++;
*d=1234;
return x;
}
компилятор будет иметь право предполагать, что запись в *д не повлияет на х.Авторы Стандарта хотели перечислить ситуации, в которых функция, подобная вышеприведенной, которая получает указатель из неизвестного источника, должна была бы предположить, что она могла бы создать псевдоним, казалось бы, не связанной глобальной, не требуя, чтобы типы полностью соответствовали.К сожалению, в то время как обоснование настоятельно рекомендует, чтобы авторы Стандарта намеревались описать стандарт минимального соответствия в случаях, когда у компилятора в противном случае не было бы оснований полагать, что вещи могут иметь псевдоним , правило не требует, чтобы компиляторыраспознавать псевдонимы в тех случаях, когда это очевидно , и авторы gcc решили, что они скорее сгенерируют наименьшую возможную программу, соответствующую плохо написанному языку стандарта, чем сгенерируют код, который на самом делеполезно, и вместо того, чтобы распознавать псевдонимы в тех случаях, когда это очевидно (хотя все еще можно предположить, что вещи, которые не выглядят как псевдонимы, не будут), они скорее потребуют, чтобы программисты использовали memcpy
, таким образом, требуякомпилятор, позволяющий предположить, что указатели неизвестного происхождения могут иметь псевдоним практически для чего угодно, что препятствует оптимизации.