Почему побитовое и операторное замыкание не происходит? - PullRequest
6 голосов
/ 13 марта 2012

Все мы знаем, что логический оператор && замыкает накоротко, если левый операнд равен false, потому что мы знаем, что если один операнд равен false, то результат также равен false.

Почему побитовый оператор & также не закорачивает? Если левый операнд равен 0, то мы знаем, что результат также равен 0. Каждый язык, который я тестировал в (C, Javascript, C #), оценивает оба операнда вместо остановки после первого.

Есть ли причина, по которой было бы плохой идеей допустить короткое замыкание оператора &? Если нет, то почему большинство языков не делают его коротким? Это похоже на очевидную оптимизацию.

Ответы [ 5 ]

9 голосов
/ 13 марта 2012

Я думаю, это потому, что битовый and в исходном языке обычно переводится довольно напрямую в битовую and инструкцию, выполняемую процессором. Это, в свою очередь, реализовано в виде группы с соответствующим количеством and вентилей в аппаратном обеспечении.

В большинстве случаев я не вижу в этом большей оптимизации. Оценка второго операнда обычно обходится дешевле, чем проверка того, стоит ли вам его оценивать.

7 голосов
/ 13 марта 2012

Короткое замыкание не является устройством оптимизации.Это устройство управления потоком.Если вам не удастся замкнуть накоротко p != NULL && *p != 0, вы не получите немного более медленную программу, вы получите программу сбоя.

Этот тип короткого замыкания почти никогда не имеет смысла для побитовых операторов, дороже обычного оператора без короткого замыкания.

2 голосов
/ 13 марта 2012

Если компилятор должен выдать проверку для обоих операндов &, я думаю, что это будет намного медленнее в любом нормальном состоянии.

2 голосов
/ 13 марта 2012

Побитовые операции, как правило, настолько дешевы, что проверка делает операцию вдвое длиннее или больше, тогда как выигрыш от короткого замыкания логического оператора потенциально очень велик.

1 голос
/ 13 марта 2012

По той же причине, по которой * не замыкает накоротко, если первый операнд равен 0 - это будет неясный особый случай, и добавление специальных тестов времени выполнения для него замедлит все умножения.

Когда операнды не являются константами, короткое замыкание обходится дороже, чем не короткое замыкание, поэтому вы не хотите делать это, если программист явно не запрашивает это. Таким образом, вы действительно хотите иметь чистые и простые правила относительно того, когда это происходит.

...