2012-05-13 3 views
1

Я прочитал C vs C++ и почему C является предпочтительным по сравнению с C++, но каково будет влияние написания кода на C-компиляторе с помощью компилятора C++ и использования во встроенных программах. Возможно, существует некоторая разница в стандартных определениях, таких как нулевой указатель и т. Д.C++ скомпилированный код C против Pure C во встроенном программировании?

Чтобы сделать его более ясным, если я напишу файл embedded.cpp с кодами c и скомпилирую с помощью компилятора C++, будет ли полученный код таким же эффективным, как и код embedded.c. Я думаю, что компиляторы C были оптимизированы и создали оптимизированный код. Это все причины?

+0

В основном, компиляторы сначала ** переводят код на свой промежуточный язык ** и рядом с машинным кодом, так что в, например, GCC, существуют те же оптимизации, что и для C и C++. Зачем использовать компилятор C++ для кода C? –

+0

Да нет смысла использовать C++-компилятор для кода C. Но я просто хотел знать, будет ли gcc и g ++ на точно таком же коде выдавать тот же эффективный код, который можно использовать в среде, такой как встроенное программирование. – Dexters

+2

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

ответ

7

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

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

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

+1

«... С редко даже вспоминается» - и не зря,) –

+2

Я вижу действительно ужасный код C в продуктах, а C - простой язык. Программисты на С ++ вряд ли будут в среднем умнее или лучше обучены, чем программисты на C, а C++ намного сложнее, чем C. Моя ставка заключается в том, что есть справедливый бит кода C++, который похож на ужасный код C, в квадрате. Только гадать, хотя :-) –

+5

Что вы считаете встроенной системой? Ноутбук? Смартфон? Кажется, что вы только видели какую-то странную небольшую нишу всего встроенного рынка. Если мы посмотрим на настоящие встроенные системы, которые не просто еще один вкус ПК: автомобильная/промышленная/medtech/аэрокосмическая и т. Д. И т. Д., Примерно 90% встроенного рынка - C. Другие 10% - это в основном ассемблер, C++ и ADA, где ассемблер, вероятно, все еще самый большой из этих трех. C# и Java рядом с несуществующими во встроенных системах. – Lundin

2

Если вы скомпилируете свой код с помощью компилятора C++, из среды ожидается среда выполнения C++, включая удаление строк, обработку записей ctor/dtor и т. Д., Которые могут отсутствовать.

C требует более простой среды выполнения (crt0 и чистого начального состояния) и должен быть готов практически на всех платформах.

Решение имеет значение только в том случае, если вы работаете над (или разрабатываете) платформу с ограниченной поддержкой C++ из ОС, libstdC++ или инструментальной цепочки.

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

0

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

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

+0

Не так. Я много лет использую C++ для встроенных систем на основе чистого металла, и мне приходилось многократно запускать запуск во время работы. Единственное отличие состоит в том, что C++ вызывает конструкторы для глобальных статических объектов * до * ввода main(). Это, по-видимому, инициализация, которая в любом случае должна была бы принимать дело так или иначе; это просто вопрос того, когда это происходит. Если у вас нет таких объектов, накладных расходов нет. – Clifford

+0

например, cout, cin, cerr всегда строятся независимо от того, используете вы это или нет. – pizza

+0

Прошу отличить; они предоставляются библиотекой, а не встроенной, если библиотека C++ не связана (а многие встроенные системы не используют библиотеку C++), объекты не будут создаваться. Конечно, если код * только * действительный C, не нужно будет связывать iostreams. – Clifford

1

Если вы скомпилируете код с помощью компилятора C++, то этот код по определению является кодом C++, а не C, даже если он также действителен C-кодом.

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

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

C++ имеет более строгие требования к типовому соглашению и более высокую проверку ошибок - это несколько менее разрешительно в отношении действительного кода; обычно, если ваш C-код компилируется как C++ без ошибок или предупреждений, то это, вероятно, лучший/чистый код. Есть некоторые исключения, например, в C, как правило, discouraged from explicitly casting the return from malloc(), но на C++ выбора нет, и поскольку неявные декларации функций не требуются, аргумент для того, чтобы этого не делать в C, не выполняется. Таким образом, в этом случае, чтобы сделать ваш C-код действительным C++, вам придется написать его таким образом, что, хотя он действителен на C, некоторые могут считать плохую практику. Лично, если вы подавляете или игнорируете предупреждения компилятора C о пропавших прототипах, вы, вероятно, получаете то, что заслуживаете в любом случае, поэтому я бы сказал, что в любом случае я буду писать ваш код C для совместимости с C++.

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

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