Man muss auch dazusagen (und das kann ich ja hier, da es ein Jammer-Thread ist), dass C++ mit seinem scheiß Definitionsdateimodell dafür echt suboptimal ist.
Also, falls ihr es nicht wusstet: In jeder C++-Datei landet durch den Präprozessor eine Kopie der Header, die er
#includet. Wenn der Präprozessor diese Monsterdatei zusammenschustert, überspringt er Kommentare und per #ifdef deaktivierten Quelltext
nicht einfach, sondern ersetzt ihn durch Leerzeichen. Das ist nötig um irgendwas konsistent zu halten; was genau, weiß ich nicht mehr. Dadurch wird jede einzelne .cpp, wenn sie den Compiler erreicht, eine zweistellige MiB-Zahl groß.
Ich habe mal irgendwann mein Framework für fixe Kompilierzeiten optimiert und kann mich erinnern, dass es so ziemlich unmöglich ist, unter 20 MiB zu kommen. Meistens hat sich das dann bei 40 MiB pro .cpp eingependelt. Wenn man die WinAPI oder DirectX einbindet hat man
keine Chance, unter diese Werte zu kommen und ich kann mir gut vorstellen, dass bei großen Projekten mit Monstern wie boost früher oder später die 100-MiB-pro-.cpp-Grenze fällt. Guckt euch mal an, wie viele .cpp-Dateien euer Projekt enthält und überschlagt, welche Lawine auf den Compiler zurollt, wenn ihr auf
Rebuild drückt.
Der Trend zu Header-only-Bibliotheken macht die Sache nicht besser. Dadurch wird jedes Modul, das diese Bibliothek einbindet, doppelt- bis dreimal so groß, wenn es den Compiler erreicht – Templates und Definitionen sind halt länger als Deklarationen. (Und der Linker wird außerdem mit Symbolen geschwemmt, da die Definitionen der
inline-Funktionen in jeder Datei landen, die die Bibliothek
#includet.) Auch sind die meisten STLs nicht superpräzise gekapselt; das seht ihr ja allein daran, dass das halbe
namespace std verfügbar ist, sobald ihr
<iostream> einbindet. (Wer zwischen verschiedenen Compilern portiert, weiß, dass plötzlich Symbole der STL nicht mehr gefunden werden – weil die STL des neuen Systems dann wohl nicht mehr so
#include-wütig ist. Darum jedes STL-Objekt, das ihr benutzt, bei
C++ Reference nachgucken und den entsprechenden Header einbinden, auch, wenn es zufällig ohne kompiliert.)
Das ist eigentlich katastrophal. Und darum empfiehlt Microsoft auch immer, vorkompilierte Header zu benutzen. Da brechen dann in fast jedem Fall 99 % des Compiler-Inputs weg,
auch für IntelliSense. Trotzdem eine Nachlässigkeit im Design, dass es mir schaudert. Da liegt dann auch einer der wenigen Vorteile von hippen Sprachen wie Java. Da muss die Autovervollständigung im Vergleich zu C++ nur ein Hundertstel bis Tausendstel des Inputs verarbeiten.