Нужны ли мне файлы .CPP вообще?Использовать только заголовки и сделать все встроенным? - PullRequest
4 голосов
/ 18 декабря 2011

GCC 4.6.1, в частности.

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

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

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

Ответы [ 4 ]

3 голосов
/ 18 декабря 2011

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

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

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

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

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

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

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

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

2 голосов
/ 18 декабря 2011

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

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

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

2 голосов
/ 18 декабря 2011

Вот несколько причин, по которым не стоит:

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

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

...