Эксплуатационные преимущества строгого сглаживания

В C, каковы же преимущества производительности, связанные с соблюдением строгих ограничений?

Ответы

Ответ 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 дать мне предупреждение.