Rafael 🌵
мне тут посоветовали glog юзать из-за ок доков
Rafael 🌵
пиплы, если я пишу либу, то как мне glog прикрутить?
Крылатый
А не лущ для либы внешний логгер?
Крылатый
Ну вот захочу я заюзать твою либу, а у меня другой логгер. Чо делать?
Rafael 🌵
Ну вот захочу я заюзать твою либу, а у меня другой логгер. Чо делать?
хмм, логично, думаешь внутри либы юзать exceptions?
Rafael 🌵
юзать исключения это верный подход или есть другие варианты?
🦥Alex Fails
Реткоды
🦥Alex Fails
ака "коды возврата"
Artem
Реткоды это хорошо
Artem
И -fno-exceptions
Rafael 🌵
и что лучше реткоды или исключения? что и почему
Artem
Можно и так и так, но не нужно смешивать в рамках одной библиотеки
Artem
Эксепшены точно не нужно использовать для стандартных ситуаций
Artem
Потому что они работают долго
Светомеч
А с этого момента можно поподробнее?
Artem
Они должны использоваться только для ошибок, а не для обычных ситуаций
Artem
что значит "обычные ситуации"?
Непопадание в кеш, отсутствие искомого элемента в списке,...
Rafael 🌵
вот например у меня есть парсер, где я передаю числа допустим я использую для хранения переменню int64t что мне делать если пришло число более чем max_uint64t?
🦥Alex Fails
строка на входе?
Artem
Наверное, это не самая частая ситуация? Тогда можно эксепшн
Светомеч
throw дороже if
Это-то ясно. Но не едиными же условиями всё обрабатывать
Rafael 🌵
вот пример: http://redis.io/topics/protocol
Artem
То есть, это ведь именно ошибка, а не стандартная ситуация
Vladislav
Если ты эмбедщик, то можно и едиными
Если ты эмбедщик, возможно c++ - не лучший выбор
Artem
Кроме того, код с исключениями хуже поддаётся анализу
🦥Alex Fails
Если ты эмбедщик, возможно c++ - не лучший выбор
@ThatEmbeddedGuy , нет, ну ты слышал?😃
Artem
Что может быть критично для особенно важных подсистем
Alexey
Embedded тоже разные бывает.
Rafael 🌵
Что может быть критично для особенно важных подсистем
эээ, наоборот же, в случае исключений код более явно показывает, какую ошибку он перехватывает
Rafael 🌵
даже коменты не особото и нужны в таком случае (кончено это зависит от ситуации)
Vladislav
эээ, наоборот же, в случае исключений код более явно показывает, какую ошибку он перехватывает
в коде не видно, какие функции что могут кинуть, что осложняет анализ
Artem
Я пишу анализ
Artem
Исключения - это сложно :)
Artem
У тебя граф потока управления разрастается очень сильно, если обработка ошибок построена на исключениях
Artem
Потому что они могут где-то ловиться, где-то пробрасываться, они бывают разных типов и приезжают из разных мест
Rafael 🌵
и как тогда реткоды спасают в этом случае?
Artem
Точно смоделировать такое очень дорого по ресурсам и почти всегда не необходимо
Artem
Поэтому точность теряется
Artem
Реткоды обрабатываются сразу
Artem
И явно
Artem
Они не ездят из функции в функцию и не ловятся скопом
Kirill
throw дороже if
Зато пока нет throw, никаких накладных расходов. А при использовании кодов после каждой функции ветвление.
Kirill
Вот и считайте
Rafael 🌵
и, насколько я знаю, на некоторых платформах if дорогое удовольствие, типо армов например
Rafael 🌵
люблю конструктивные разговоры👍🏻 спасибо господа
Richard
Если ты эмбедщик, возможно c++ - не лучший выбор
Не, все норм с цпп в эмбеде, это точно.
Richard
и, насколько я знаю, на некоторых платформах if дорогое удовольствие, типо армов например
Какие именно? На Cortex-M не дорого вроде как, вполне нормально.
Rafael 🌵
Какие именно? На Cortex-M не дорого вроде как, вполне нормально.
я года 2 назад про это читал, поэтмоу к сожалению сейчас уже не помню где это было
Rafael 🌵
но вроде на армах
Richard
Окей, но если попадешь - скинь, пожалуйста)
Richard
Интересно почитать
Kirill
Я видел компилятор для процессора, в котором все целые два байта, даже char.
[object Object]
Народ, сколько времени у вас выволняется следующая программка по вычислению числа ПИ? Есть большая разница, если компилировать на GNU GCC и на Visual C++ с результатами 9 и 20 секунд соответственно #include <iostream> #include <ctime> using namespace std; int main() { const clock_t begin_time = clock(); double pi = 0.0; bool boolean = false; double i; for(i = 1.0; i < 10000000000.0; i = i+2.0) { if(boolean){ pi = pi - 1.0/i; boolean = false; } else { pi = pi + 1.0/i; boolean = true; } } cout.precision(9); cout << pi*4 << endl; cout.precision(4); cout << float( clock () - begin_time ) / CLOCKS_PER_SEC; return 0; }
Richard
За исключения - исключительные ситуации, тогда ничего такого. Заодно можно удобно инфу собрать. В остальном возвращаемого значения хватит, только стоит сделать так, чтобы не было кэш-промахов
Vladislav
~ $ g++-6 -O3 -o pi pi.cpp && time ./pi 3.14159265 19.97./pi 19.88s user 0.09s system 97% cpu 20.399 total ~ $ clang++ -O3 -o pi pi.cpp && time ./pi 3.14159265 20.12./pi 20.03s user 0.09s system 99% cpu 20.325 total
ovf
крутые нынче пошли процессоры -- при том, что gcc не убирает if при -O3, разницы между вариантом выше и без if почти нет -- и то и другое 7.5-8s
[object Object]
Интересно.
Rafael 🌵
А с флагом -Ofast провали?
Rafael 🌵
И ктсати вы векторизацию не юзаете
Kirill
@ThatEmbeddedGuy , нет, ну ты слышал?😃
Люди далеки от отрасли, отсюда и домыслы
Kirill
Кстате при работе в ембеддеде некоторые люди тоже далеки от отрасли)) почему то большинство вещей держится на суевериях а не фактах
🦥Alex Fails
Надо бороться с этим
Kirill
Типо не используй динамическую память в микроконтроллерах, козленочком станешь, фрагмениация бла бла бла. Но если юзать raii и выделять память на этапе инициализации периферии то ничего страшного не будет
🦥Alex Fails
От реализации дин памяти тож зависит
Kirill
От реализации дин памяти тож зависит
В фриртосе есть 4 типа управления кучей, выбирай на вкус)
🦥Alex Fails
Kirill
Просвещай нас
Так оно не нужно если зарабатывать этим не будешь. А чисто плюсами заработать проще чем плюсами в микроконтроллерах
🦥Alex Fails
Дык все равно ж интересно