А какие компиляторы C++ для того же AVR поддерживают исключения? Впрочем и на STM32 с исключениями все не сладко.
Беру относительно простой проект на STM32, с оптимизацией по размеру получается 8760 байт... Включаю исключения, компилятор естественно ругается, что не хватает десятка функций и вообще newlib-nano исключения не поддерживает. Удаляю --specs=nano.specs, теперь компилируется, но дополнительно имеем +5972 флеша и +1080 RAM, при том что исключения нигде не используются. Добавляю еще один try/catch, на этот раз получаем +64K и +1512, причем zero-cost обработка исключений появилась только на 64-х битных процах, там все в таблицах, а на всех остальных еще будут немаленькие структуры на стеке создаваться и т.д., т.е. у AVR банально столько RAM нет, а у многих и флеша чтобы Hello World с исключениями собрать.
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
Reflector, именно это я и называю "все не сладко". Я отлично знаю, сколько памяти потребуется для поддержки исключений. И это не считая проблемы с предсказуемостью времени, необходимого для обработки исключения. Что для задач реального времени очень плохо.
Reflector писал(а):
стандартная функция возвращает код ошибки и указатель, а результат возвращает по ссылке.
Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.
Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.
В С нет ссылок, в С тоже придется анализировать код ошибки после каждого вызова, собственно и std::from_chars() вместе с огромным количеством других стандартных функций в С тоже нет, так что единственное его преимущество - это относительная простота, но это не важно для тех кто С++ уже знает. А кто не знает или знаком поверхностно с С++ не самых последних версий, то весьма проблематично объяснить, что дело далеко не в одном синтаксическом сахаре. Я недавно показывал пример простенького компилятора работающего на стадии компиляции, в результате остаются только инструкции во флеше. Есть эмулятор ARM работающий на стадии компиляции, т.е. в принципе можно разместить во флеше исходник на любом языке программирования, он скомпилируется, запустится эмуляция STM32 и во флеше сохранится png с осциллограммой сигналов на его пинах, при этом ни байта кода в рантайме не будет. Неслабый такой синтаксический сахар
Ну спасибо, что хоть признали незнание C ))) Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель. А в C++ возможность объявления сразу ссылки, а не указателя, кстати с тем же амперсандом, лишь синтаксический сахар.
Reflector писал(а):
в С тоже придется анализировать код ошибки после каждого вызова
Именно, итого взяли C++, а кодируем так же, как на C
Reflector писал(а):
std::from_chars() вместе с огромным количеством других стандартных функций в С тоже нет
Не стоит так явно заниматься демагогий. Нет в стандарте языка. Но в виде функций вне стандарта все давно есть.
Reflector писал(а):
так что единственное его преимущество - это относительная простота, но это не важно для тех кто С++ уже знает
Во-первых, это далеко не единственное преимущество C. Например, чаще всего C выбирают вместо C++ из-за поддержки стандартизированного ABI, чем C++ уж точно похвастаться не может. Даже если выбирается C++, то ABI приходится делать C-подобным, отказываясь от передачи объектов и/или ссылок на них. Во-вторых, простота позволяет писать более надежный код. Процитирую Линуса Торвальдса: "One of the absolute worst features of C++ is how it makes a lot of things so context-dependent - which just means that when you look at the code, a local view simply seldom gives enough context to know what is going on."
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
VladislavS, как отдельного типа - нет. Но как конструкция языка - есть. Отсюда и передача адреса переменной, а не самой переменной, в функцию называется "by reference". Дословно - "по ссылке". Если более простым языком, то возможности указателей в C с лихвой перекрывают возможности ссылок в C++, но требуют учитывать в коде, что указатель может быть NULL или неопределен, тогда как ссылка в C++ определена всегда.
Вы каким-то словоблудием занимаетесь. На английском это звучит так "The unary address-of operator (&) returns the address of (that is, a pointer to) its operand." Ни о каких ссылках тут речи не идёт даже близко.
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
VladislavS, ISO/IEC 9899:TC2 "A pointer type may be derived from a function type, an object type, or an incomplete type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type."
P.S. И осторожней с переходом на личности. Мало того, что это совершенно неприменимо в технической дискуссии, так это еше и один из ключевых признаков демагогии.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4599 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
ПростоНуб, в чистом С нет такого понятия, как "Ссылка". То, что Вы в стандарте где-то отыскали это слово, не даёт права использовать фразу "вернуть по ссылке", относительно языка С. Вернуть по ссылке - это вернуть, с помощью ссылки. Вернуть по указателю - вернуть, с помощью указателя. Вернуть по значению - ...... Отсюда и все недопонимания между вами. Выражовываца надо корректней
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
VladislavS, а и не говорил, что в языке есть тип ссылка. Указано лишь, что указатель может содержать ссылку. Более того, она и является ссылкой и способна выполнять все функции ссылки в С++.
Спойлер
VladislavS писал(а):
Где вы переход на личности усмотрели? Ссылку, пожалуйста, на фразу, на слово, на что угодно...
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
VladislavS, А какие проблемы? Например, в игрушке на AVR у меня в указателях хранились ссылки на спрайты. Спрайтов нет ни в C, ни в C++, но кто мешает их реализовать средствами языка?
Карма: 38
Рейтинг сообщений: 268
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2723 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
VladislavS, Ну Вы мне никак не запретите ссылаться на спрайты в программе на языке, в стандарте которого спрайтов нет. И самое смешное. наверняка и в своих программах Вы ссылаетесь на объекты более высокого уровня, чем примитивы языка )))
Именно, итого взяли C++, а кодируем так же, как на C
Нет, взяли С++, пишем как на С++, но ошибки проверяем как на С.
ПростоНуб писал(а):
Не стоит так явно заниматься демагогий. Нет в стандарте языка. Но в виде функций вне стандарта все давно есть.
Кто есть вне стандарта? From_chars() там быть никак не может, т.к. она возвращает результат по ссылке или может вне стандарта С есть шаблонные или constexpr функции? Может даже классы есть? В С убогая и не безопасная стандартная библиотека которая практически не развивается, для эмбедда это еще не так страшно, а на ПК написание программ на С превращается в сплошное велосипедостроение и шастание по чужим github-ам в поисках библиотек сомнительного качества...
ПростоНуб писал(а):
чаще всего C выбирают вместо C++ из-за поддержки стандартизированного ABI, чем C++ уж точно похвастаться не может.
К счастью это легко проверить, поднимите руке те, кто пишет на С, а не С++, из-за поддержки стандартизированного ABI
ПростоНуб писал(а):
Во-вторых, простота позволяет писать более надежный код.
Какая связь простого из-за небольшого для изучения размера языка с надежным кодом? Бейсик простой, но значительно надежнее С. C#10 один из самых громоздких языков и в этом плане конкурирует с С++20, но на нем тоже пишутся более простые и надежные программы чем на С. Можно прочитать брошюрку по С на 30 страниц и как-то начать на нем писать, но можно еще прочитать статью на десяток страниц и дополнительно привнести в С некоторые не особо замысловатые фичи из С++ которые сделают код чище и надежнее, хотя надежнее он станет уже просто от того, что его компилируют более привередливым компилятором.
Кто мешает в C функции так же возвращать структуру? Если же речь про параметр value, то в упор не понимаю, в чем тут разница между передачей указателя по значению в С и передачей ссылки в С++, которая в скомпилированном коде так же будет передаваться по значению адреса (того же значения указателя) в ней содержащегося.
Другое дело, что при жестких требованиях к производительности и памяти, не возникает никакого желания тащить такого монстра, как from_chars, себе в код. Например, зачем мне куча кода для парсинга чисел по основанию 36, если мне нужен парсинг только целых десятичных чисел? Как это не компилируй, но ворох лишнего кода всегда прибежит.
Reflector писал(а):
К счастью это легко проверить, поднимите руке те, кто пишет на С, а не С++, из-за поддержки стандартизированного ABI
Было бы смешно, если не было бы так грустно. Для примера, в MS SQL, PostgreSQL или Oracle подключить скомпилированное расширение в виде so/dll - элементарно, причем динамически без остановки сервиса. Потому что они написаны на C и ABI стандартизирован. А вот к Clickhouse - только с полной перекомпиляцией всего Clickhouse и рестартом сервиса, так как он написан на C++, а ABI в C++ меняется даже от версии к версии одного компилятора, не говоря уже о разных. Тоже самое можно сказать и про ESP32, и про старшие МК на ARM, где расширения могут быть востребованы. а полная рекомпиляция или не желательна, или даже невозможна, так как все исходники недоступны.
Reflector писал(а):
ПростоНуб писал(а):
Во-вторых, простота позволяет писать более надежный код.
Какая связь простого из-за небольшого для изучения размера языка с надежным кодом?
Речь не о простоте для изучения (не думаю, что к C это относится, так же, как, для примера, к Lisp). А о простоте синтакиса. Читайте внимательней:
ПростоНуб писал(а):
Процитирую Линуса Торвальдса: "One of the absolute worst features of C++ is how it makes a lot of things so context-dependent - which just means that when you look at the code, a local view simply seldom gives enough context to know what is going on."
Спрашивал в другой теме, но ответов не получил. Спрошу и здесь: Метод (или пр. код) для расчета a * b / c? Три переменные: uint32_t, цифры большие. Нет uint64_t и умножение > 32 бита, а если делится первым, теряю разрядность ниже. С float ОК (в первом приближении), но по нескольким причинам избегаю использовать.
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 39
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения