TL; DR: В общем, лучше всего включить только то, что вам нужно. В том числе больше может отрицательно сказываться на двоичном размере и запуске (должно быть незначительным), но в основном вредит время компиляции без предварительно скомпилированных заголовков.
Ну, естественно, вы должны включить, по крайней мере, те заголовки, которые гарантированно охватывают все ваши цели.
В любом случае может случиться так, что для стандартных заголовков C++ разрешено включать друг в друга, как того требует разработчик, и заголовкам разрешено включать дополнительные символы в поле std
-namespace (см. Why is "using namespace std" considered bad practice?).
Далее, иногда содержащий дополнительный заголовок может привести к созданию дополнительных объектов (см. std::ios_base::Init
), хотя хорошо продуманная библиотека минимизирует такие (это единственный экземпляр в стандартной библиотеке, насколько я знаю).
Но большая проблема - это не размер и эффективность скомпилированного (и оптимизированного) двоичного кода (который не должен затрагиваться, кроме предыдущей точки, эффект которой должен быть минимальным), но время компиляции при активном развитии (см. также How does #include <bits/stdc++.h> work in C++?).
И последнее (строго так, что комитет работает над модульным предложением, см. C++ Modules - why were they removed from C++0x? Will they be back later on?), что отрицательно сказалось на добавлении лишних заголовков.
Если вы, естественно, не используете предварительно скомпилированные заголовки (см. Why use Precompiled Headers (C/C++)?), и в этом случае, в том числе больше в предварительно скомпилированных заголовках и, следовательно, везде, а не только там, где это необходимо, до тех пор, пока эти заголовки не будут изменены, фактически уменьшит компиляцию - большую часть времени.
Существует инструмент clang для определения минимальных заголовков, называемый include-what-you-use.
Он анализирует clang AST, чтобы решить, что это как сила, так и слабость:
Вам не нужно учить его обо всех символах, которые заголовок делает доступными, но он также не знает, все ли просто работало таким образом, в этой ревизии или же они являются договорными.
Итак, вам нужно дважды проверить его результаты.
Он будет влиять на размер вашего двоичного файла, но я не думаю, что проблем с производительностью не будет. – Haris
@Haris: нет, это не так, в общем случае. –
@PaulR, будут проблемы с производительностью? – Haris