zHz00 Untitled

среда, 23 марта 2022
04:43 Когда оптимизация предусмотрена стандартом
Оптимизация при компиляции часто представляет собой не благо, а проблему. Компилятор на своё усмотрение может выкинуть кусок кода, который счёл ненужным. Да, от этого есть некоторые методы защиты, типа использования volatile, но во многих случаях проще оптимизацию отключить, чем разбираться с её последствиями. Если у вас есть годный гайд по работе с оптимизацией в компиляторах си/си++, сообщите мне, пожалуйста.

Но есть случаи, когда даже с отключённой оптимизацией можно столкнуться с неожиданным поведением.

Один чувак отлаживал программу, и обнаружил странное поведение. Если написать:

if(var||func())//...

то программа работала неправильно. А если написать:

if(func()||var)//...

то программа работала как положено.

Неправильность первого варианта заключалась в том, что в первом случае функция func() просто не вызывалась, что влекло непредвиденные последствия. Причина была проста. Первый операнд операции "или" был истинным, поэтому компилятор не вычислял значение второго, а значит и не вызывал функцию. И правда, зачем тратить время, когда и так уже понятно, что общий результат будет истинным?

И это не оптимизация компилятора. Такое поведение предписывается стандартом. Например ISO/IEC 9899:TC3, пункт 6.5.14 (похоже, это какой-то черновик, но данный пункт одинаков во всех версиях) гласит:

... If the first operand compares unequal to 0, the second operand is not evaluated.

Про "или" я не знал, но я давно знал про такое поведение для оператора "и", поэтому для меня оказалось ожидаемо, что с "или" ситуация аналогична. Что же там говорится про "и"? Пункт 6.5.13:

... If the first operand compares equal to 0, the second operand is not evaluated.

То есть, для оператора "и" второй операнд не вычисляется, если первый оказался ложным. Такой вот подводный камень.

UPD. мне сообщили, что в си-шарп и питоне поведение такое же.

@темы: Программирование, Борьба с техникой, Очевидное-невероятное

URL
У нас еще не принято, как на Западе, терпимо относиться к...
Ты мучаешься над идеей или задачей, исписываешь горы бума...
Мне часто хочется посадить дома цветы. Купить те штуки, ...
Ши:Зачёт провален, т.к. И.Н.К. решила в последний момент ...
Вот скачал себе оффлайнового клиента. Постоянно забываю, ...
:)

23.03.2022 в 04:59

23.03.2022 в 04:59
Удивительно, что для тебя это новость. Это даже на собеседованиях спрашивают.
Я всегда, когда пишу условия через || или &&, прикидываю, какое из них более "легкое" или наиболее вероятное, и ставлю такое первым, чтобы отсеять часть неудобных вычислений.
URL

23.03.2022 в 05:00

23.03.2022 в 05:00
Кстати, не является ли твой ник Z-символикой?
URL

23.03.2022 в 11:40

23.03.2022 в 11:40
Foul thing,
>>Удивительно, что для тебя это новость

Век живи -- век учись. Ты лучше скажи, как пользоваться оптимизацией и не страдать.

>>какое из них более "легкое" или наиболее вероятное

Огого!

>>не является ли твой ник Z-символикой?

Чёт не знаю, как тебе ответить. Оставляю это на откуп твоей фантазии.
URL

23.03.2022 в 11:47

23.03.2022 в 11:47
Стратегия Z.
Фильм World War Z.
URL

23.03.2022 в 23:23

23.03.2022 в 23:23
> мне сообщили, что в си-шарп и питоне поведение такое же
есть даже такой паттерн: var = var || 'default_value'

> Оставляю это на откуп твоей фантазии
Но это же очевидная H-символика) Впрочем, всегда есть опасность найти смысл там, где его нет =)
URL

24.03.2022 в 04:00

24.03.2022 в 04:00
есть даже такой паттерн: var = var || 'default_value'
В сишарпе не работает, т.к. отсутствует неявное преобразование к bool.

Точнее, вот это сработает:
var a = true;
a = a || true;

А вот это - нет:
var a = 3;
a = a || 2;

Инты к булю не кастуются.
URL

24.03.2022 в 11:48

24.03.2022 в 11:48
zHz - z-символика, Н-символика, опять z-символика.
HDoom - H-символика.
Альзо, таки ещё аниме Dragonball Z.
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail