Разрабатываю приложение для встроенного Linux (ARM). Он будет выполняться 500 раз в секунду, поэтому важна скорость. Я бы предпочел использовать C ++, но боюсь, что он будет медленнее, чем C, даже если я буду избегать таких необычных функций, как виртуальные функции. Есть ли причина использовать C или так же хорошо писать на C ++?
C против C ++ во встроенном Linux
Ответы (8)
C ++ в целом не страдает от потерь времени выполнения по сравнению с C - (за исключением нескольких вещей, таких как RTTI).
За исключением нескольких странных обстоятельств, компилятор должен иметь возможность определять, какую виртуальную функцию вызывать во время компиляции, и поэтому не добавлять накладных расходов.
Изменить: Хорошо, с таким разнообразием компиляторов, процессоров, библиотек времени выполнения, ОС есть некоторые функции C ++, которые могут создавать более медленный код, есть некоторые функции, которые могут создавать более быстрый код.
Но можем ли мы все согласиться с тем, что C ++ больше не исключается автоматически из использования встраиваемых?
В C ++ у вас есть такие вещи, как метапрограммирование шаблонов, которые разрешают во время компиляции несколько ситуаций, в которых C или любой другой процедурный язык программирования должен был бы выполняться во время выполнения.
Я должен сказать больше. Метапрограммирование шаблонов и некоторые уловки наследования классов действительно удивительны. Это может сэкономить вам много времени на обработку, которое в противном случае вы бы потратили на «ifing» и «переключение».
Это означает, что C ++ может быть на самом деле быстрее, чем C.
Очевидно, что вы можете программировать «на C», используя C ++, и у вас вообще не будет никаких штрафов. Если вы не слишком любите C ++, я бы посоветовал вам сделать «C на C ++» или «C с расширениями C ++», просто чтобы воспользоваться улучшениями C ++, но реальное преимущество, которое вы получите, - это программирование C ++. способ. Там вы увидите, что C ++ , довольно часто, или быстрее, или чище, чем C, или, по крайней мере, так же быстро, как.
Не бойся. Face C ++. После stdc ++ (против libc) накладных расходов по размеру кода почти не будет. Если размер вашего приложения от среднего до большого, он будет разбавлен.
Я использую C ++ от простого 8-битного ATmega до ARM9 от Marvell, проходя через AVR32 UC3 и Cortex-M3, и всегда считаю это выгодным.
Если вам нужен конкретный совет в той или иной ситуации, не стесняйтесь спрашивать.
Основная причина выбора C вместо C ++ - это размер скомпилированного двоичного файла, который может быть реальным ограничением для встроенных систем.
По производительности нет ощутимой разницы, если правильно использовать язык. Вы можете писать медленный код C так же легко, как и медленный C ++, если вы знаете о скрытых механизмах того, что вы пишете, вам все будет в порядке.
operator<<ostream&, float), но не case 'f': из реализации printf().
- person MSalters; 01.03.2011
fwrite. Помните, что не на всех встроенных платформах есть консоли.
- person Thomas Matthews; 01.03.2011
sizeof(streambuf)+sizeof(std::cout), потому что их можно комбинировать.)
- person MSalters; 03.03.2011
Пока вы ограничиваете функции, которые вы используете, у вас не будет большого падения производительности в C ++ по сравнению с C. Функции, которых вы хотите избежать, включают: исключения, RTTI и сохраняйте иерархию классов как можно более плоской. (и экономно используйте виртуальные функции).
C ++ хорош, если у вас достаточно ОЗУ и флэш-памяти во встроенной системе. Библиотека времени выполнения C ++ (libstdc ++) велика и поставляется в дополнение к стандартной библиотеке C (libc), даже если вы используете только C ++.
libstdc++ маленьким. uClibc++ существует не просто так; к сожалению, он довольно неполный.
- person R.. GitHub STOP HELPING ICE; 01.03.2011
Вы можете использовать C ++, но будьте особенно осторожны.
За размером внимательно следите за файлом карты компоновщика. Вы можете найти его, включая массу ненужных вещей, просто из невинно выглядящего заявления.
Для скорости, профиля или случайной паузы часто. Очень легко сделать больше new и delete, чем вам действительно нужно, особенно с классами контейнеров, и будьте очень осторожны с такими вещами, как итераторы. Часто они делают вам ненужные услуги.
Вы можете пошагово выполнить код на уровне языка ассемблера, чтобы убедиться, что он делает только то, что вам действительно нужно, что должно быть примерно таким же, как и код C.
Настоящий ключ к размеру и скорости эффективного кода, встроенного или нет, для программиста заключается в том, чтобы полностью понимать последствия своих или других решений.
В некоторой степени C ++ предоставляет больше возможностей там, где что-то дорогое может выглядеть обманчиво невинным. Функциональность, эквивалентная функциям C ++, часто требует большего количества рукописного ввода на странице, что может привести к большему размышлению о возможных расходах. Но это ни в коем случае не абсолютное - C (и его библиотеки) также имеют риск обманчиво невинных расходов.
В конце концов, ничто не заменит понимание того, что вы просили в каждой строке кода.
Я использую плату ARM9 для управления оборудованием, и я использую приложение C и C ++ на плате 500 МГц. Вам решать, использовать язык и как реализовать свою логику для реализации функциональности. Потому что я не обнаружил никаких проблем с запуском моего приложения в течение дня с контролем оборудования.
При написании программы внимательно выберите переменную, сравните ее с дополнительными инструкциями / циклами, инициализацией. также используйте флаг оптимизации Gcc во время компиляции.
У меня нет проблем с запуском моего приложения Qt и программы C на плате ARM 9 с тактовой частотой 500 МГц.