В частности, я спрашиваю о двойном '!' в параметрах файла __built_in.
Это двойное отрицание, согласно языку 'C'?
Спасибо-
В частности, я спрашиваю о двойном '!' в параметрах файла __built_in.
Это двойное отрицание, согласно языку 'C'?
Спасибо-
!! — это просто два оператора ! рядом друг с другом. Это простой способ преобразовать любое ненулевое значение в 1 и оставить 0 как есть.
__builtin_expect, потому что оно принимает два значения, которые должны быть равными. Если бы было просто if(x), то да, было бы лишним.
- person Drew McGowen; 28.07.2014
!!(42) == 1- person Colonel Thirty Two   schedule 28.07.2014if(x)иif (__builtin_expect(!!(x), 1))должны воспроизводить один и тот же порядок в сгенерированном коде. Тот, кто написал это, неправильно выполняет преждевременную оптимизацию. - person Havenard   schedule 28.07.2014xболее чем вероятно не равен нулю, но это может быть и не так. Если это часть часто проверяемого условного оператора, дополнительная производительность от успешного предсказания переходов может быть существенной. - person Drew McGowen   schedule 28.07.2014if(x)будет достаточно. Глядя с точки зрения сборки, единственное, что это делает, - это преобразованиеxлибо в 0, либо в 1 передtest x,xвместо того, чтобы делатьtest x,xсразу. Может даже заставить компилятор использовать вместо этогоcmp x,1, что еще хуже. - person Havenard   schedule 28.07.2014if(x)— это общий тест на то, равно лиxнулю. Компилятор не делает предположений о том, какое значение более вероятно, поэтому он должен полагаться на динамическое прогнозирование ветвлений и может неправильно угадать первые несколько итераций. Однако использование__builtin_expectвставит подсказку относительно того, каким должно быть начальное предположение для предсказания ветвления. - person Drew McGowen   schedule 28.07.2014__builtin_expect. - person Havenard   schedule 28.07.2014__builtin_expectбесполезен, я просто говорю, что в данном конкретном случае он не выполняет свою задачу. - person Havenard   schedule 28.07.2014