The classic approach hurts run-time as well as compile-time.
Compiler has available only information in the current file, plus included headers.
Compiler cannot make use of information in other modules until they get linked together.
Specifially cannot inline across modules.
This is why critical information (inline functions and templates) migrates into headers.
This talk focuses on compile speed, but be aware that it also enables important optimizations.