Подтвердить что ты не робот

Не нужны ли файлы для накладных расходов?

Я видел пару вопросов о том, как обнаружить ненужные файлы #include в проекте на С++. Этот вопрос меня часто заинтриговал, но я не нашел удовлетворительного ответа.

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

Как далеко этот вид накладных расходов распространяется на скомпилированные объектные файлы и двоичные файлы?

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

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

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

4b9b3361

Ответ 1

Это не влияет на производительность двоичного файла или даже на содержимое двоичного файла почти для всех заголовков. Объявления не генерируют никакого кода вообще, определения inline/static/anonymous-namespace оптимизируются, если они не используются, и ни один заголовок не должен включать внешне видимые определения (которые ломаются, если заголовок включен более чем одной единицей перевода).

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

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

Ответ 2

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

Затем вам также необходимо установить эти библиотеки в каждую систему, в которую вы хотите встроить программу. Это может стать кошмаром, особенно когда следующий программист должен установить некоторую базу данных клиентской библиотеки, хотя программа никогда не использует базу данных.

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

Ответ 3

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

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

Это ускорит компиляцию. См. Книгу Скотта Майерса по этому вопросу

Ответ 4

Простым ответом является ДА, его накладные расходы по сравнению с компиляцией, но для времени выполнения он просто создает какую-либо разницу. Причина заключается в том, что вы добавляете #include <iostream> (только для примера) и предполагаете, что вы не используете какую-либо ее функцию, тогда g++ 4.5.2 содержит дополнительные 18 560 строк кода для обработки (компиляции). Но что касается служебных расходов во время выполнения, я вряд ли думаю, что это создает проблему с производительностью.

Вы также можете ссылаться на Не используются ли вредоносные в C/С++?, где мне очень понравился этот момент, сделанный Дэвидом Яном

Любые синглтоны, объявленные как внешние в заголовке и определенные в исходный файл будет включен в вашу программу. Это, очевидно, увеличивается использования памяти и, возможно, способствует повышению производительности на заставляя пользователя чаще обращаться к своему файлу страницы (не так много проблема в настоящее время, поскольку одиночные числа обычно имеют малый и средний размер и потому что большинство людей, которых я знаю, имеют 6 ГБ ОЗУ).