Как разработчик прошивок / встроенных систем, я могу сказать вам, ребята, некоторые причины, по которым C по-прежнему является выбором №1 по сравнению с C ++, и да, я свободно владею ими обоими.
1) Некоторые цели, которые мы разрабатываем, имеют 64 КБ ОЗУ как для кода, так и для данных, поэтому вы должны убедиться, что каждый счетчик байтов, и да, я занимался оптимизацией кода, чтобы сэкономить 4 байта, которые стоили мне 2 часа, и это в 2008 г.
2) Каждая функция библиотеки C проверяется, прежде чем мы впускаем их в окончательный код, из-за ограничения размера, поэтому мы предпочитаем, чтобы люди не использовали div (без аппаратного делителя, поэтому нужна большая библиотека), malloc (потому что у нас нет кучи вся память выделяется из буфера данных в 512-байтовом блоке и требует проверки кода) или другой объектно-ориентированной практики, которая несет большие потери. Помните, что каждая библиотечная функция, которую вы используете, имеет значение.
3) Вы когда-нибудь слышали о термине "наложение"? у вас так мало места для кода, что иногда вам приходится заменять его другим набором кода. Если вы вызываете библиотечную функцию, она должна быть резидентной. Если вы используете его только в функции наложения, вы тратите много места, полагаясь на слишком много объектно-ориентированных методов. Итак, не предполагайте, что какая-либо функция библиотеки C, не говоря уже о C ++, будет принята.
4) Приведение и даже упаковка (где невыровненная структура данных пересекает границу слова) необходимы из-за ограниченного дизайна аппаратного обеспечения (т. Е. Механизма ECC, который подключен определенным образом) или для того, чтобы справиться с аппаратной ошибкой. Вы не можете предполагать слишком много неявно, так зачем же объектно ориентировать это слишком сильно?
5) Худший сценарий: устранение некоторых объектно-ориентированных методов заставит разработчиков задуматься, прежде чем они будут использовать ресурсы, которые могут взорваться (т. Е. Выделение 512 байт в стеке, а не из буфера данных), и предотвратить некоторые из потенциально худших сценариев, которые не тестируются и не исключают весь путь кода вместе.
6) Мы используем много абстракций, чтобы уберечь оборудование от программного обеспечения и сделать код максимально переносимым и удобным для моделирования. Аппаратный доступ должен быть заключен в макрос или встроенную функцию, которые условно скомпилированы между разными платформами, тип данных должен быть приведен как размер байта, а не целевой, использование прямого указателя не допускается (поскольку некоторые платформы предполагают, что ввод-вывод с отображением памяти является как память данных) и т. д.
Я могу придумать больше, но вы поняли идею. У нас, ребят из прошивки, есть объектно-ориентированное обучение, но задача встроенной системы может быть настолько аппаратно-ориентированной и низкоуровневой, что не является высокоуровневой или абстрактной по своей природе.
Кстати, каждая работа по прошивке, в которой я работал, использует контроль версий, я не знаю, откуда вы взяли эту идею.
-какая прошивка парень от SanDisk.