Есть ли причина использовать C вместо C++ для встроенной разработки?


вопрос

у меня есть два компилятора на моем оборудовании C++ и C89

Я думаю об использовании C++ с классами, но без полиморфизма (чтобы избежать vtables). Основные причины, по которым я хотел бы использовать C++:

  • Я предпочитаю использовать "встроенные" функции, а не макросы.
  • Я хотел бы использовать пространства имен, как я префиксы загромождают код.
  • Я вижу, что C++ немного безопаснее в основном из-за шаблонов и подробностей литье.
  • мне очень нравятся перегруженные функции и конструкторы (используемые для автоматического литья).

вы видите какие-либо причины придерживаться C89 при разработке для очень ограниченного оборудования (4 Кб оперативной памяти)?

вывод

Спасибо за ваши ответы, они очень полезные!

я продумал тему, и я буду придерживаться C главным образом потому, что:

  1. легче предсказать фактический код в C и это очень важно, если у вас есть только 4 Кб оперативной памяти.
  2. моя команда состоит в основном из разработчиков C, поэтому расширенные функции C++ не будут часто использоваться.
  3. Я нашел способ встроенных функций в моем компиляторе C (C89).

трудно принимать один ответ как вы предоставили так много хороших ответов. К сожалению, я не могу создать Вики и принять его, поэтому я выберу один ответ, который заставил меня думать больше всего.

29 75

29 ответов:

две причины для использования C над C++:

  1. для многих встроенных процессоров либо нет компилятора C++, либо вам придется доплачивать за него.

кроме того, оригинальный вопрос и ряд комментариев, упоминают 4 Кб RAM. Для типичного встроенного процессора объем оперативной памяти (в основном) не связан с размером кода, поскольку код хранится и запускается из flash.

конечно, объем пространства для хранения кода-это то, что нужно иметь в виду, но поскольку на рынке появляются новые, более емкие процессоры, это меньше проблем, чем раньше для всех, кроме самых дорогостоящих проектов.

об использовании a подмножество C++ для использования со встроенными системами: теперь есть MISRA C++ стандарт, который может быть стоит посмотреть.

EDIT: см. также этот вопрос, что привело к дискуссии о c против C++ для встраиваемых систем.

на очень ограниченная ресурсами цель, такая как 4 КБ оперативной памяти, я бы проверил воды с некоторыми образцами, прежде чем совершать много усилий, которые не могут быть легко перенесены обратно в чистую реализацию ANSI C.

рабочая группа Embedded C++ предложила стандартное подмножество языка и стандартное подмножество стандартной библиотеки для его использования. К сожалению, я потерял след этих усилий, когда журнал пользователя C умер. Похоже, есть статья в Википедия, и комитета все-таки существует.

во встроенной среде, вы действительно должны быть осторожны с выделением памяти. Чтобы обеспечить этот уход, вам может потребоваться определить глобальный operator new() и его друзья к чему-то, что не может быть даже связано, так что вы знаете, что он не используется. Размещение new С другой стороны, скорее всего, будет вашим другом, при разумном использовании вместе со стабильным, потокобезопасным и гарантированным распределением задержки схема.

встроенные функции не вызовут особых проблем, если они не достаточно велики, чтобы они должны были быть истинными функциями в первую очередь. Конечно, макросы их замены имели ту же проблему.

Шаблоны тоже не могут вызвать проблемы, если их создание не работает амок. Для любого шаблона, который вы используете, проверьте свой сгенерированный код (карта ссылок может иметь достаточные подсказки), чтобы убедиться, что только экземпляры, которые вы намеревались использовать получилось.

еще одна проблема, которая может возникнуть, - это совместимость с вашим отладчиком. Это не является необычным для в противном случае пригодного аппаратного отладчика, чтобы иметь очень ограниченную поддержку для взаимодействия с исходным исходным кодом. Если вы эффективно должны отлаживать в сборке, то интересное искажение имени C++ может добавить дополнительную путаницу в задачу.

RTTI, динамические приведения, множественное наследование, тяжелый полиморфизм и исключения-все это связано с некоторой стоимостью времени выполнения для их использование. Некоторые из этих функций уровня, которые стоят в течение всей программы, если они используются, другие просто увеличить вес классов, которые нуждаются в них. Знайте разницу и выбирайте расширенные функции мудро с полным знанием, по крайней мере, беглого анализа затрат/выгод.

в небольшой встроенной среде вы будете либо напрямую связываться с ядром реального времени, либо работать непосредственно на оборудовании. В любом случае, вам нужно будет убедиться, что ваш код запуска среды выполнения обрабатывает C++ конкретные задачи запуска правильно. Это может быть так же просто, как убедиться, что вы используете правильные параметры компоновщика, но поскольку обычно имеется прямой контроль над источником до точки входа power on reset, вам может потребоваться провести аудит, чтобы убедиться, что он все делает. Например, на платформе ColdFire, над которой я работал, инструменты dev поставляются с CRT0.S модуль, который имел инициализаторы C++ присутствует, но закомментировать. Если бы я использовал его прямо из коробки, я был бы озадачен глобальные объекты, конструкторы которых никогда не работали вообще.

кроме того, во встроенной среде часто необходимо инициализировать аппаратные устройства, прежде чем их можно будет использовать, и если нет ОС и загрузчика, то это делает ваш код. Вам нужно будет помнить, что конструкторы для глобальных объектов выполняются доmain() называется так, что вам нужно будет изменить свой локальный CRT0.S (или его эквивалент), чтобы выполнить эту аппаратную инициализацию до мировые конструкторы не вызываются. Очевидно, в верхней части main() слишком поздно.

нет. Любые функции языка C++, которые могут вызвать проблемы (полиморфизм времени выполнения, RTTI и т. д.) можно избежать при выполнении встроенной разработки. Существует сообщество встроенных разработчиков C++ (я помню, как читал столбцы встроенных разработчиков, использующих C++ в старом журнале пользователей C/C++), и я не могу представить, что они были бы очень вокальными, если бы выбор был настолько плох.

The технический отчет о производительности C++ является отличным руководством для такого рода вещей. Обратите внимание, что в нем есть раздел о встроенных проблемах программирования!

кроме того, ++ при упоминании встроенного C++ в ответах. Стандарт не на 100% на мой вкус, но это хорошая ссылка при принятии решения о том, какие части C++ вы можете отбросить.

при программировании для небольших платформ мы отключаем исключения и RTTI, избегаем виртуального наследования и платим близко обратите внимание на количество виртуальных функций, которые у нас лежат.

ваш друг-это карта компоновщика: часто проверяйте ее, и вы быстро обнаружите источники кода и статическую память.

после этого применяются стандартные рекомендации по использованию динамической памяти: в такой ограниченной среде, как та, которую вы упомянули, Вы можете вообще не использовать динамические выделения. Иногда вы можете уйти с пулами памяти для небольших динамических распределений или " на основе фреймов" распределение, где вы предварительно выделяете блок и выбрасываете все это позже.

Я рекомендую использовать компилятор C++, но ограничивая использование конкретных функций C++. Вы можете программировать как C в C++ (среда выполнения C включена при выполнении C++, хотя в большинстве встроенных приложений вы все равно не используете стандартную библиотеку).

вы можете пойти дальше и использовать классы C++ и т. д. просто

  • ограничить использование виртуальных функций (как ты сказал)
  • ограничить использование шаблонов
  • для встроенной платформы, вы хотите чтобы переопределить оператор new и/или использовать оператор new для выделения памяти.

Как прошивка / встроенный системный инженер, я могу сказать вам, ребята, некоторые из причин, почему C по-прежнему является выбором № 1 по сравнению с C++, и да, я свободно владею ими обоими.

1) некоторые цели, которые мы разрабатываем, имеют 64 КБ ОЗУ как для кода, так и для данных, поэтому вы должны убедиться, что каждый байт подсчитан, и да, я занимался оптимизацией кода, чтобы сэкономить 4 байта, которые стоили мне 2 часа, и это в 2008 году.

2) каждая функция библиотеки C просматривается, прежде чем мы впустим их в окончательный код, потому что поэтому мы предпочитаем, чтобы люди не использовали divide (нет аппаратного делителя, поэтому нужна большая библиотека), malloc (потому что у нас нет кучи, вся память выделяется из буфера данных в 512-байтовом куске и должна быть проверена кодом) или другую объектно-ориентированную практику, которая несет большой штраф. Помните, что каждая библиотечная функция, которую вы используете count.

3) когда-нибудь слышали о термине overlay? у вас так мало места в коде, что иногда вам приходится менять вещи с другим набором кода. Если вы вызываете библиотечную функцию, тогда библиотечная функция должна быть резидентной. Если вы используете его только в функции наложения, вы тратите много места, полагаясь на слишком много объектно-ориентированных методов. Поэтому не принимайте никаких функций библиотеки C, не говоря уже о том, чтобы принимать C++.

4) литье и даже упаковка (где невыровненная структура данных пересекает границу слова) необходимы из-за ограниченного аппаратного дизайна (т. е. двигатель ECC, который подключен определенным образом) или справиться с аппаратной ошибкой. Нельзя предположите слишком много неявно, так почему объект ориентирует его слишком много?

5) наихудший сценарий: устранение некоторых объектно-ориентированных методов заставит разработчиков подумать, прежде чем они будут использовать ресурсы, которые могут взорваться (т. е. выделение 512bytes в стеке, а не из буфера данных), и предотвратить некоторые из потенциальных наихудших сценариев, которые не тестируются или не устраняют весь путь кода вместе.

6) мы используем много абстракции для того чтобы держать оборудование от программного обеспечения и сделайте код как можно более портативным, а симуляцию дружественной. Аппаратный доступ должен быть обернут в макрос или встроенную функцию, которые условно компилируются между различными платформами, тип данных должен быть приведен как размер байта, а не целевой, прямое использование указателя не допускается (потому что некоторые платформы предполагают, что сопоставленный ввод-вывод памяти совпадает с памятью данных) и т. д.

Я могу придумать больше, но вы получаете идею. Ребята из США прошивки имеют объектно-ориентированное обучение, но задача встроенная система может быть настолько аппаратно ориентированной и низкоуровневой, что она не является высокоуровневой или абстрактной по своей природе.

кстати, каждое задание прошивки, в котором я был, использует систему управления версиями, я не знаю, откуда вы получаете эту идею.

- какой-то парень с прошивкой из SanDisk.

мое личное предпочтение-C, потому что:

  • Я знаю, что каждая строка кода делает (и расходов)
  • Я не знаю C++ достаточно хорошо, чтобы знать, что каждая строка кода делает (и стоит)

почему люди так говорят? Ты не знайте, что делает каждая строка C, если вы не проверяете выход asm. То же самое касается и C++.

например, что asm делает это невинное заявление продукция:

a[i] = b[j] * c[k];

это выглядит довольно невинно, но компилятор на основе gcc создает этот asm для 8-битного микро

CLRF 0x1f, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1f, F, ACCESS
MOVWF 0x1e, ACCESS
MOVLW 0xf9
MOVF 0xfdb, W, ACCESS
ADDWF 0x1e, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfa
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1f, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x1c
NOP
MOVFF 0xfef, 0x1d
NOP
MOVLW 0x1
CLRF 0x1b, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1b, F, ACCESS
MOVWF 0x1a, ACCESS
MOVLW 0xfb
MOVF 0xfdb, W, ACCESS
ADDWF 0x1a, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfc
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1b, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x18
NOP
MOVFF 0xfef, 0x19
NOP
MOVFF 0x18, 0x8
NOP
MOVFF 0x19, 0x9
NOP
MOVFF 0x1c, 0xd
NOP
MOVFF 0x1d, 0xe
NOP
CALL 0x2142, 0
NOP
MOVFF 0x6, 0x16
NOP
MOVFF 0x7, 0x17
NOP
CLRF 0x15, ACCESS
RLCF 0xfdf, W, ACCESS
ANDLW 0xfe
RLCF 0x15, F, ACCESS
MOVWF 0x14, ACCESS
MOVLW 0xfd
MOVF 0xfdb, W, ACCESS
ADDWF 0x14, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfe
MOVF 0xfdb, W, ACCESS
ADDWFC 0x15, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0x16, 0xfee
NOP
MOVFF 0x17, 0xfed
NOP

количество производимых инструкций в значительной степени зависит от:

  • размеры a, b и c.
  • хранятся ли эти указатели в стеке или являются глобальными
  • находятся ли i, j и k в стеке или являются глобальными

Это особенно верно в крошечном встроенном мире, где процессоры поэтому мой ответ будет заключаться в том, что C и C++ так же плохи, как и друг с другом, если вы всегда не изучаете вывод asm, и в этом случае они так же хороши, как и друг с другом.

Угу

Я слышал, что некоторые люди предпочитают C для встраиваемых работу из-за того, что это проще и поэтому легче предсказать фактический код, который будет сгенерирован.

Я лично думаю, что написание C-style C++ (используя шаблоны для безопасности типов) даст вам много преимуществ, хотя и я не вижу никакой реальной причины не делать этого.

Я не вижу причин использовать C вместо C++. Все, что вы можете сделать в C, вы можете сделать это и в C++. Если вы хотите избежать накладных расходов VMT, не используйте виртуальные методы и полиморфизм.

тем не менее, C++ может предоставить некоторые очень полезные идиомы без накладных расходов. Один из моих любимых-Раи. Классы не обязательно дорогие с точки зрения памяти или производительности...

Я написал некоторый код для ARM7 embedded paltform на IAR Workbench. Я настоятельно рекомендую полагаться на шаблоны для оптимизации времени компиляции и прогнозирования пути. Избегайте динамического литья, как чума. Используйте черты / политику в своих интересах, как предписано в книге Андрея Александреску, современный дизайн C++.

Я знаю, это может быть трудно узнать, но я также уверен, что ваш продукт выиграет от этого подхода.

хорошая причина, а иногда и единственная причина заключается в том, что там до сих пор нет компилятора C++ для встраиваемых систем. Это относится, например, к микрочип PIC микро-контроллерах. Для них очень легко писать, и у них есть бесплатный компилятор C (на самом деле, небольшой вариант C), но нет компилятора C++ в поле зрения.

для системы, ограниченной 4K ОЗУ, я бы использовал C, а не C++, просто чтобы вы могли быть уверены, что видите все, что происходит. Дело в том, что с C++ очень легко использовать гораздо больше ресурсов (как процессор, так и память), чем это похоже на взгляд на код. (О, я просто создам еще один BlerfObject, чтобы сделать это...упс! из памяти!)

вы можете сделать это на C++, как уже упоминалось (без RTTI, без vtables и т. д.), Но вы потратите столько времени, чтобы убедиться, что ваше использование C++ не уходит от вас, как вы бы делали эквивалент в C.

для борьбы с этой тенденцией я предпочитаю C C++, потому что это заставляет вас думать о своем коде и о том, как он взаимодействует с оборудованием более тесно - неустанно близко.

из многолетнего опыта я считаю, что C заставляет вас придумывать лучшие решения проблем, в частности, убираясь с вашего пути и не заставляя вас тратить много времени на удовлетворение ограничений, которые некоторые компиляторы-писатели считали хорошей идеей, или выяснять, что происходит "под крышками".

в этом ключе языки низкого уровня, такие как C, вы тратите много времени на аппаратное обеспечение и создание хороших пакетов данных/алгоритмов, в то время как языки высокого уровня тратят много времени на царапины голову интересно, что там происходит, и почему вы не можете сделать что-то разумное в ваших конкретных условиях. Избиение вашего компилятора в подчинение (сильная типизация-худший преступник) не является продуктивным использованием времени.

Я, вероятно, хорошо вписываюсь в программистскую форму-мне нравится контроль. На мой взгляд, это не недостаток личности для программиста. Контроль - это то, за что нам платят. Точнее, безупречный контроль. C дает вам гораздо больше контроля, чем С.++

лично с 4 Кб памяти я бы сказал, что вы не получаете намного больше пробега из C++, поэтому просто выберите тот, который кажется лучшей комбинацией компилятора/времени выполнения для работы, так как язык, вероятно, не будет иметь большого значения.

обратите внимание, что это также не все о языке в любом случае, так как также имеет значение библиотека. Часто c libs имеют немного меньший минимальный размер, но я мог бы представить, что c++ lib, предназначенный для встроенной разработки, сокращается, поэтому обязательно протестируйте.

некоторые говорят, что компиляторы C могут генерировать гораздо более эффективный код, потому что они не должны поддерживать расширенные функции C++ и поэтому могут быть более агрессивными в их оптимизации.

конечно, в этом случае вы можете поставить два конкретных компиляторов для теста.

C выигрывает в переносимости-потому что он менее неоднозначен в спецификации языка; поэтому предлагает гораздо лучшую переносимость и гибкость для разных компиляторов и т. д. (меньше головных болей).

Если вы не собираетесь использовать функции C++ для удовлетворения потребностей, тогда идите с C.

видите ли вы какие-либо причины придерживаться C89 при разработке для очень ограниченных аппаратное обеспечение (4 Кб оперативной памяти)?

лично, когда дело доходит до встроенных приложений (Когда я говорю embedded, я не имею в виду вздрагивание, iPhone и т. д.. раздутые встроенные устройства сегодня). Я имею в виду устройства с ограниченным ресурсом. Я предпочитаю C, хотя я работал с C++ довольно много, а также.

например, устройство, о котором вы говорите, имеет 4kb ОЗУ, ну просто для по этой причине я бы не рассматривал C++. Конечно, вы можете создать что-то небольшое с помощью C++ и ограничить его использование в своем приложении, как предлагали другие сообщения, но C++ "может" потенциально усложнить/раздуть ваше приложение под обложками.

вы собираетесь связать статически? Вы можете сравнить статическое фиктивное приложение с использованием c++ vs c. это может привести вас к рассмотрению C вместо этого. С другой стороны, если вы можете построить приложение на C++ внутри ваши требования к памяти, идите на это.

ИМХО, В общем, во встроенных приложениях мне нравится знать все, что происходит. Кто использует память / системные ресурсы, сколько и почему? Когда они их освободят?

при разработке для цели с X количеством ресурсов, процессора, памяти и т. д.. Я стараюсь оставаться на нижней стороне использования этих ресурсов, потому что вы никогда не знаете, какие будущие требования появятся, поэтому вы добавляете больше кода в проект, который был "предположительно" должно быть простым небольшим приложением, но в конечном итоге становится намного больше.

мой выбор обычно определяется библиотекой C, которую мы решаем использовать, которая выбирается на основе того, что нужно сделать устройству. Так, 9/10 раз .. это заканчивается тем, что uclibc или newlib и C. ядро, которое мы используем, также оказывает большое влияние на это, или если мы пишем наше собственное ядро.

Это также выбор точки соприкосновения. Большинство хороших программистов нет проблем с использованием C++ (хотя многие жалуются все время, что они его используют) .. но я не нашел обратного, чтобы быть правдой (в моем опыт.)

в проекте, над которым мы работаем (который включает в себя измельченное ядро), большинство вещей выполняется на C, однако небольшой сетевой стек был реализован на C++, потому что было просто проще и менее проблематично реализовать сеть с использованием C++.

конечным результатом является то, что устройство будет либо работать и проходить приемочные тесты, либо нет. если вы можете реализовать foo в ограничениях XX stack и YY heap с использованием языка z, перейдите к нему, используйте все, что делает вас больше продуктивный.

мое личное предпочтение-C, потому что:

  • Я знаю, что каждая строка кода делает (и расходов)
  • Я не знаю C++ достаточно хорошо, чтобы знать, что каждая строка кода делает (и стоит)

Да, мне комфортно с C++, но я не знаю его так же хорошо, как и стандартный C.

теперь, если вы можете сказать обратное, хорошо, используйте то, что вы знаете :) если он работает, проходит тесты и т. д.. Что проблема?

сколько ROM / FLASH у вас есть?

4кб ОЗУ еще может означать сотни килобайт флэш-памяти для хранения кода и статических данных. ОЗУ такого размера, как правило, предназначено только для переменных, и если вы будете осторожны с ними, вы можете поместить довольно большую программу с точки зрения строк кода в память.

однако C++ имеет тенденцию усложнять ввод кода и данных во FLASH из-за правил построения объектов во время выполнения. В C, постоянная структура может быть легко помещен во флэш-память и доступен как аппаратно-постоянный объект. В C++ постоянный объект потребовал бы, чтобы компилятор оценивал конструктор во время компиляции, что, я думаю, все еще выходит за рамки того, что может сделать компилятор C++ (теоретически вы могли бы это сделать, но это очень трудно сделать на практике).

Так что в" маленькой ОЗУ"," большой вспышке " я бы пошел с C в любой день. Обратите внимание, что хороший промежуточный выбор i C99, который имеет большинство хороших функций C++ для не-классового-код.

В общем нет. C++ - это супер набор C. Это было бы особенно верно для новых проектов.

вы находитесь на правильном пути, избегая конструкций C++, которые могут быть дорогостоящими с точки зрения времени процессора и памяти печати ног.

обратите внимание, что некоторые вещи, такие как полиморфизм, могут быть очень ценными - это по существу указатели на функции. Если вы обнаружите, что они вам нужны, используйте их - с умом.

кроме того, хорошая (хорошо разработанная) обработка исключений может сделать ваше встроенное приложение более надежный, чем приложение, которое обрабатывает вещи с традиционными кодами ошибок.

единственная причина предпочесть C IMHO будет, если компилятор C++ для вашей платформы не в хорошей форме (багги, плохая оптимизация и т. д.).

книги C++ для игровых программистов имеет информацию, связанную с тем, когда размер кода будет увеличен на основе функций из C++.

У вас есть встроенный в C99. Может быть, вам нравятся ctors, но дело получения dtors right может быть грязным. Если оставшаяся единственная причина не использовать C-это пространства имен, я бы действительно придерживался C89. Это связано с тем, что вы можете перенести его на немного другую встроенную платформу. Позже вы можете начать писать в C++ на том же коде. Но остерегайтесь следующего, где C++ не является надмножеством C. Я знаю, что вы сказали, что у вас есть компилятор C89, но в любом случае это сравнение C++ с C99, так как например, первый элемент истинен для любого C, так как K&R.

sizeof 'a' > 1 в C, а не в C++. В C у вас есть массивы переменной длины VLA. Пример: func (int i){int a[i]. В C у вас есть элементы массива переменных VAM. Пример: struct{int b;int m [];}.

просто хочу сказать, что нет системы с "неограниченными" ресурсами. Все в этом мире ограничено, и каждое приложение должно учитывать использование ресурсов независимо от того, является ли его ASM, C, JAVA или JavaScript. Манекены, которые выделяют несколько Мб "просто для уверенности", делают iPhone 7, Pixel и другие устройства чрезвычайно тяжелыми. Неважно, есть ли у вас 4 КБ или 40 Гб.

но с другой стороны, чтобы противостоять тратить ресурс - это время, которое требуется, чтобы сохранить эти ресурсы. Если это займет 1 неделя дополнительная, чтобы написать простую вещь в C, чтобы сохранить несколько тиков и несколько байтов вместо использования C++ уже реализован, протестирован и распространен. Зачем? Как купить USB-концентратор. да, вы можете сделать это сами, но будет ли это лучше? более надежный? дешевле, если считать свое время?

просто побочная мысль-даже мощность от вашей розетки не безгранична. Попробуйте исследовать, откуда он исходит, и вы увидите в основном его от сжигания чего-то. Закон энергии и материала все еще актуально: никакой материал или энергия не появляется и не исчезает, а скорее трансформируется.

для проблемы выделения памяти я могу рекомендовать использовать Quantum Platform и его подход к машине состояний, поскольку он выделяет все, что вам нужно во время инициализации. Это также помогает облегчить проблемы конкуренции.

этот продукт работает как на C, так и на C++.

Это зависит от компилятора.

Не все встроенные компиляторы реализуют все C++, и даже если они это делают, они могут не очень хорошо избегать раздувания кода (что всегда является риском с шаблонами). Протестируйте его с помощью нескольких небольших программ, посмотрите, не возникнут ли какие-либо проблемы.

но учитывая хороший компилятор, нет, нет причин не использовать C++.

Я только что нашел пример, как использовать ISO C++ для встроенной разработки, что может быть интересно для кого-то, кто принимает решение всякий раз, когда использовать C++ или C.

его предоставил Бьярне Страуструп на своей странице:

Чтобы посмотреть, как ISO C++ можно использовать для серьезного программирования встроенных систем, см. в JSF воздуха транспортного средства написания кода на C++ стандарты.

другой пост ответа на другой аспект вопроса:

"Танос"

некоторые предыдущие ответы говорят об этом. Почему ты вообще думаешь, что этот звонок существует? Для действительно небольшой платформы malloc, как правило, недоступен или определенно необязателен. Реализация динамического выделения памяти, как правило, имеет смысл, когда у вас есть RTOS в нижней части вашей системы, но до тех пор это чисто опасно.

вы можете получить очень далеко без него. Просто подумайте обо всех старых программах FORTRAN, которые даже не имели надлежащего стека для локальных переменных...

на такой ограниченной системы. Просто пойдите для ассемблера. Дает вам полный контроль над каждым аспектом, и не дает никаких накладных расходов.

вероятно, намного быстрее, так как многие встроенные компиляторы не являются лучшими оптимизаторами (особенно если сравнить его с современными компиляторами, такими как те, которые у нас есть для рабочего стола (intel, visual studio и т. д.))

"да, да...но c является многоразовым и...". На такой ограниченной системы, скорее всего, вы не будете повторно использовать много кода на во всяком случае, другая система. В той же системе ассемблер так же пригоден для повторного использования.