Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Что означает эта конструкция __builtin_expect(!!(x), 1)

Автор вопроса: user3342339Ответов: 1

В частности, я спрашиваю о двойном '!' в параметрах файла __built_in.

Это двойное отрицание, согласно языку 'C'?

Спасибо-

  • Его можно использовать для преобразования любого значения в логическое значение 0 или 1. Пример. !!(42) == 1 Colonel Thirty Two 28.07.2014
  • Связанный: заголовок stackoverflow.com/questions/7346929/ Mihai Todor 28.07.2014
  • if(x) и if (__builtin_expect(!!(x), 1)) должны воспроизводить один и тот же порядок в сгенерированном коде. Тот, кто написал это, неправильно выполняет преждевременную оптимизацию. Havenard 28.07.2014
  • @Havenard на самом деле, это оптимизация для прогнозирования ветвлений. Он говорит, что x более чем вероятно не равен нулю, но это может быть и не так. Если это часть часто проверяемого условного оператора, дополнительная производительность от успешного предсказания переходов может быть существенной. Drew McGowen 28.07.2014
  • Да, но если он может быть ненулевым, то if(x) будет достаточно. Глядя с точки зрения сборки, единственное, что это делает, - это преобразование x либо в 0, либо в 1 перед test x,x вместо того, чтобы делать test x,x сразу. Может даже заставить компилятор использовать вместо этого cmp x,1, что еще хуже. Havenard 28.07.2014
  • if(x) - это общий тест на то, равно ли x нулю. Компилятор не делает предположений о том, какое значение более вероятно, поэтому он должен полагаться на динамическое прогнозирование ветвлений и может неправильно угадать первые несколько итераций. Однако использование __builtin_expect вставит подсказку относительно того, каким должно быть начальное предположение для предсказания ветвления. Drew McGowen 28.07.2014

cclanggnu

Ответы

Ответ 1 · рейтинг 3 · Drew McGowen

!! - это просто два оператора ! рядом друг с другом. Это простой способ преобразовать любое ненулевое значение в 1 и оставить 0 как есть.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы