Я попытался найти ответ на этот вопрос, используя SO. Есть ряд вопросов, которые перечисляют различные плюсы и минусы создания библиотеки только для заголовков в С++, но я не смог найти тот, который делает это в количественных выражениях.
Итак, в количественных выражениях, что отличается от использования традиционно разделенного заголовка С++ и файлов реализации в сравнении с заголовком?
Для простоты я предполагаю, что шаблоны не используются (потому что они требуют только заголовка).
Чтобы уточнить, я перечислил то, что я видел из статей, чтобы быть плюсами и минусами. Очевидно, что некоторые из них нелегко поддаются количественной оценке (например, простота использования) и поэтому бесполезны для количественного сравнения. Я буду отмечать те, которые я ожидаю поддающимися количественной оценке метками (поддающимися количественной оценке).
Плюсы только для заголовков
- Это проще включить, так как вам не нужно указывать параметры компоновщика в вашей системе сборки.
- Вы всегда компилируете весь код библиотеки с тем же компилятором (параметры), что и остальная часть вашего кода, поскольку функции библиотеки вставляются в ваш код.
- Это может быть намного быстрее. (Количественный)
- Может предоставить компилятору/компоновщику лучшие возможности для оптимизации (объяснение/поддающееся количественной оценке, если возможно)
- Требуется, если вы все равно используете шаблоны.
Против только заголовка
- Он раздувает код. (количественно) (как это влияет как на время выполнения, так и на объем памяти)
- Больше времени компиляции. (Количественный)
- Потеря разделения интерфейса и реализации.
- Иногда приводит к труднодоступным круговым зависимостям.
- Предотвращает двоичную совместимость общих библиотек/библиотек DLL.
- Это может усугубить сотрудников, которые предпочитают традиционные способы использования С++.
Любые примеры, которые вы можете использовать из более крупных проектов с открытым исходным кодом (сравнение кодовых баз одинакового размера), будут очень оценены. Или, если вы знаете проект, который может переключаться между версиями только для заголовков и разделенных (с использованием третьего файла, который включает оба), это было бы идеально. Анекдотические цифры полезны также, потому что они дают мне флэшку, с которой я могу получить некоторое представление.
источники за плюсы и минусы:
Спасибо заранее...
UPDATE:
Для тех, кто может читать это позже, и заинтересован в получении немного справочной информации по связыванию и компиляции, я нашел эти ресурсы полезными:
- Глава 7 http://www.amazon.com/Computer-Systems-Programmers-Perspective-Edition/dp/0136108040
- http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
- http://www.cyberciti.biz/tips/linux-shared-library-management.html
ОБНОВЛЕНИЕ: (в ответ на комментарии ниже)
Только потому, что ответы могут отличаться, это не означает, что измерение бесполезно. Вы должны начать измерять как некоторый момент. И чем больше измерений у вас есть, тем яснее изображение. То, о чем я прошу в этом вопросе, - это не вся история, а проблеск картины. Конечно, любой может использовать числа для искажения аргумента, если они хотят неэтично продвигать их предвзятость. Однако, если кто-то интересуется различиями между двумя вариантами и публикует эти результаты, я думаю, что информация полезна.
Неужели никто не интересуется этой темой, достаточно ее измерить?
Мне нравится проект перестрелки. Мы могли бы начать с удаления большинства этих переменных. Используйте только одну версию gcc для одной версии Linux. Используйте только те же аппаратные средства для всех эталонных тестов. Не компилируйте несколько потоков.
Тогда мы можем измерить:
- исполняемый размер
- во время выполнения
- Объем памяти
- время компиляции (как для всего проекта, так и для изменения одного файла)
- время ссылки