Преимущества производительности строгого алиасинга - PullRequest
17 голосов
/ 16 апреля 2009

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

1 Ответ

19 голосов
/ 16 апреля 2009

Есть страница, которая описывает псевдоним очень подробно здесь .

Есть также несколько тем 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 предупредить меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...