febb: (Default)
febb ([personal profile] febb) wrote2018-11-23 01:58 am

О сколько нам открытий чудных...

Еще вдогонку. На языке Си есть тернарный оператор ?:
"Программисты старой закалки" его помнят и с некоторым апломбом используют.
Дескать смотрите, сосунки, как надо круто писать.
Признаюсь есть и у меня такой мелкий грех, следующий по градации после
"накричал на канарейку".

Оказывается в некоторых случаях за это надо бить штангенциркулем по рукам!
Например обнаружил что в 8-битном микроконтроллере этот оператор съедает
после компиляции байтов на 20 больше, чем кондовый if-else.
Как там у Довлатова, 20 байт - "да это уже совсем другая жизнь, старик!". :)
Т.е. когда флеш память размером 1К, 20 байт просто так профукать - это
позор. Настоящий полковник просто должен выйти и пустить себе пулю.
Куда-нибудь.

Наверное это связано с тем, что код типа:

byte result = bit_flag ? 10u : 20u;

Компилятор, не парясь, правую часть реализует как int, а уже потом округляет до байта.
Как известно этот оператор может возвращать разные типы. По этой причине
видимо компилятор не может оптимизировать такие выражения по типу в правой части и выражение
вычисляется как есть. Обычно это незаметно, но надо помнить
что в смысле оптимизации кода этого оператора надо избегать.

Но иногда к примеру в С++ когда инициализируется ссылка, его вроде как нельзя избежать:

ostream & sout = err ? cerr : cout;

Можно тут как-то без него?