2011-12-18 2 views
4

GCC 4.6.1, в частности.Мне вообще нужны файлы .CPP? Использовать только заголовки и сделать все встроенным?

Я знаю, что файлы CPP служат для разделения интерфейса от реализации; это сейчас не представляет интереса.

Глядя на this, я не вижу причин не использовать только заголовки и все функции inline.

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

+2

Это общий трюк, чтобы объединить все исходные файлы в один гигантский исходный файл для сборки релиза ... GCC имеет '-fwhole-program', чтобы обеспечить более радикальную оптимизацию в таком сценарии. Новый '-flto' делает практически то же самое без ручного вмешательства. Не беспокойтесь об этом слишком много и напишите ваши программы, чтобы следующий человек мог понять и продолжить их. –

+0

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

+0

Какую выгоду вы бы выиграли от этого? –

ответ

2

Вот некоторые причины, чтобы не:

  • Нет герметизация; «Внутренние» методы видны для всей программы.
  • Загрязнение пространства имен (приводящее к именованию столкновений или ошибке программиста)
  • Проблемы зависимости; становится все труднее обеспечить, чтобы все было объявлено в правильном порядке.
  • Увеличение времени компиляции
+0

1. Инкапсуляция - это не должно быть проблемой вообще. См. [Эта часть C++ faq] (http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.8). 2. Чтобы решить эту проблему, просто напишите свой код в другом пространстве имен ... – user1071136

+0

@ user1071136: Я не говорю о безопасности. –

+0

Ох. И что? если метод является «частным», на самом деле это не имеет значения, если вы не заинтересованы в безопасности. Нет? – user1071136

2

Производительность и встраивание в сторону, есть вещи, которые вы не можете сделать с коллекторами-только, например, как static полей класса.

Сказанное, большинство (если не все) STL является только заголовком, как и большинство из Boost.

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

0

Если все функции будут «встроенными», то ваш двоичный файл будет больше, и это может привести к снижению производительности. Вы должны включить только очень маленькие и часто называемые функции.

+0

Вы должны оставить это решение компилятору. – avakar

+0

Существует различие между оптимизацией инклюдировки компилятора и ключевым словом 'inline'. Маркировка всех функций 'inline' не означает, что все функции будут встроены. – jalf

3

Основная проблема - время сбора, действительно.

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

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

С несколькими файлами .cpp вы можете внести изменения в один из них и только иметь перекомпилировать , что файл.

Но несколько популярных библиотек предназначены только для заголовков. Это определенно жизнеспособно.

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

И обратите внимание, что вы никогда не должны форсировать компилятор для inline. Ключевое слово inline (и другие трюки, которые имеют такой же эффект), не сообщают компилятору, что «это должно быть включено». Но, подавляя одно правило определения (ODR), они позволяют включать определение в несколько единиц компиляции, и поэтому для компилятора становится проще встроить , если он захочет сделать это.

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