Объединение большего количества файлов исходного кода C ++ в один файл - это подход, о котором упоминалось несколько раз в последнее время, особенно когда люди строили большие системы и извлекали сложные заголовочные файлы (тогда это будет толчком) .
Как вы упомянули VS, я обнаружил, что количество включаемых файлов в проекте и особенно размер пути включения, похоже, влияет на время компиляции Visual C ++ гораздо больше, чем время компиляции в g ++. Это особенно актуально для множества вложенных включений (опять же, это делает boost), так как для поиска всех включаемых файлов, необходимых для исходного кода, необходимо большое количество файловых поисков. Объединение кода в один исходный файл означает, что компилятор может быть намного умнее при поиске указанных включений, плюс их явно меньше, так как можно ожидать, что файлы в том же подпроекте, вероятно, будут содержать очень похожие набор заголовочных файлов.
Подход "много блоков компиляции" к разработке на C ++ обычно исходит из желания разъединить классы и минимизировать зависимости между классами, поэтому компилятор должен перестраивать минимальный набор файлов только в случае внесения каких-либо изменений. Как правило, это хороший подход, но часто он не может быть реализован в подпроекте просто потому, что файлы в нем имеют зависимости друг от друга, так что вы все равно получите довольно большие пересборки.