О сколько нам открытий чудных...
Nov. 23rd, 2018 01:58 amЕще вдогонку. На языке Си есть тернарный оператор ?:
"Программисты старой закалки" его помнят и с некоторым апломбом используют.
Дескать смотрите, сосунки, как надо круто писать.
Признаюсь есть и у меня такой мелкий грех, следующий по градации после
"накричал на канарейку".
Оказывается в некоторых случаях за это надо бить штангенциркулем по рукам!
Например обнаружил что в 8-битном микроконтроллере этот оператор съедает
после компиляции байтов на 20 больше, чем кондовый if-else.
Как там у Довлатова, 20 байт - "да это уже совсем другая жизнь, старик!". :)
Т.е. когда флеш память размером 1К, 20 байт просто так профукать - это
позор. Настоящий полковник просто должен выйти и пустить себе пулю.
Куда-нибудь.
Наверное это связано с тем, что код типа:
byte result = bit_flag ? 10u : 20u;
Компилятор, не парясь, правую часть реализует как int, а уже потом округляет до байта.
Как известно этот оператор может возвращать разные типы. По этой причине
видимо компилятор не может оптимизировать такие выражения по типу в правой части и выражение
вычисляется как есть. Обычно это незаметно, но надо помнить
что в смысле оптимизации кода этого оператора надо избегать.
Но иногда к примеру в С++ когда инициализируется ссылка, его вроде как нельзя избежать:
ostream & sout = err ? cerr : cout;
Можно тут как-то без него?
"Программисты старой закалки" его помнят и с некоторым апломбом используют.
Дескать смотрите, сосунки, как надо круто писать.
Признаюсь есть и у меня такой мелкий грех, следующий по градации после
"накричал на канарейку".
Оказывается в некоторых случаях за это надо бить штангенциркулем по рукам!
Например обнаружил что в 8-битном микроконтроллере этот оператор съедает
после компиляции байтов на 20 больше, чем кондовый if-else.
Как там у Довлатова, 20 байт - "да это уже совсем другая жизнь, старик!". :)
Т.е. когда флеш память размером 1К, 20 байт просто так профукать - это
позор. Настоящий полковник просто должен выйти и пустить себе пулю.
Куда-нибудь.
Наверное это связано с тем, что код типа:
byte result = bit_flag ? 10u : 20u;
Компилятор, не парясь, правую часть реализует как int, а уже потом округляет до байта.
Как известно этот оператор может возвращать разные типы. По этой причине
видимо компилятор не может оптимизировать такие выражения по типу в правой части и выражение
вычисляется как есть. Обычно это незаметно, но надо помнить
что в смысле оптимизации кода этого оператора надо избегать.
Но иногда к примеру в С++ когда инициализируется ссылка, его вроде как нельзя избежать:
ostream & sout = err ? cerr : cout;
Можно тут как-то без него?