Какова стоимость компиляции программы на C с помощью компилятора C ++? - PullRequest
1 голос
/ 22 марта 2011

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

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

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

Спасибо, Висенте

Ответы [ 12 ]

6 голосов
/ 22 марта 2011

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

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

3 голосов
/ 22 марта 2011

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

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

2 голосов
/ 22 марта 2011

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

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

2 голосов
/ 22 марта 2011

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

1 голос
/ 24 марта 2011

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

Спасибо всем, кто ответил на этот вопрос.

1 голос
/ 23 марта 2011

Компилятор C ++ не может скомпилировать код на C. Он может компилировать только C ++, включая очень уродливый язык, который является пересечением C и C ++ и худшим из обоих миров. Некоторый код на C вообще не будет компилироваться на компиляторе C ++, например:

char *s = malloc(len+1);

В то время как другой код C будет скомпилирован в неправильную вещь, например:

sizeof 'a'
1 голос
/ 22 марта 2011

Если это C, то вы можете ожидать, что он будет точно таким же.

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

Шаблоны «раздувают» код, но в противном случае вам пришлось бы писать один и тот же код или использовать макросы для того же эффекта, так что это не «дополнительные затраты». Наоборот, в некоторых случаях компилятор может лучше оптимизировать шаблоны.

0 голосов
/ 25 марта 2011

Запуск C ++ во время выполнения немного отличается от запуска C, поскольку он должен вызывать конструкторы для глобальных статических объектов до вызова main ().Этот цикл вызова тривиален и не должен добавлять много.

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

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

0 голосов
/ 23 марта 2011

Поскольку он помечен как «встроенный», я предполагаю, что он применяется для встроенных систем?

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

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

Все эти вызовы конструктора при загрузке являются основным недостатком эффективности для встроенных систем, где код находится в NVM, а не в RAM.Так же, как статическая инициализация, она создаст некрасивый, нежелательный пик рабочей нагрузки в начале программы, когда значения из NVM копируются в ОЗУ.

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

Но, насколько мне известно, нет способа обойти конструкторов без нарушения стандарта.

РЕДАКТИРОВАТЬ: Вот исходный код, выполненный в одной такой системе C ++, Freescale HCS08 Codewarrior 6.3.Этот код внедряется в пользовательскую программу после статической инициализации, но перед выполнением main ():

static void Call_Constructors(void) {
  int i;
  ...
  i = (int)(_startupData.nofInitBodies - 1);
  while (i >= 0) {
    (&_startupData.initBodies->initFunc)[i]();  /* call C++ constructors */
    i--;
  }
  ...

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

0 голосов
/ 23 марта 2011

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

...