Ich denke, dass viele statische Analyse-Tools können Sie nicht geben, was Sie brauchen, da sie nicht unbedingt Dinge wie Template-Instanziierungen berücksichtigen, einschließlich Header durch vorkompilierte Header eingezogen) und die Code-Generierungseigenschaften des Compilers.
Ich hatte in der Vergangenheit ein ähnliches Problem mit einer großen ausführbaren Datei, deren Größe von einer bestimmten Bibliothek dominiert wurde. Die Art und Weise, wie ich auf den Grund kam, war einfach die Größe der Objektdateien für jede .cpp zu betrachten. Das wird Ihnen nicht die ganze Geschichte geben, da der Linker ungenutzte Teile optimieren wird (obwohl es sich lohnt zu überprüfen, dass Sie diese Option gesetzt haben - /OPT:REF
für Visual Studio). Es erlaubt Ihnen jedoch, Ihre Suche zu fokussieren. Suchen Sie die zwei oder drei größten Objektdateien und sehen Sie sich dann die entsprechenden CPP-Dateien an. Sie haben dann zwei Optionen - schreiben Sie ein Skript, das die Ausgabe von objdump
(VisualStudio) oder nm -C
(gcc), wo Sie die Offsets der einzelnen Funktionen im Modul extrahieren können, so können Sie mit dem jeweils anderen differieren, um eine Idee zu bekommen der Größe jeder Funktion.
Oder die einfachste Methode ist nur, binäre Suche in der cpp-Datei zu verwenden. #ifdef den gesamten Code nach dem Ende der # enthält und kompilieren Sie es. Das wird Ihnen eine Vorstellung vom Overhead der Includes geben (wenn das selbst sehr groß ist, können Sie in die Header-Einfügungen bohren, um herauszufinden, welches am meisten beiträgt). Als nächstes deaktivieren Sie jede Hälfte des Codes mit #ifdef und finden Sie heraus, welche Hälfte größer ist. Mit dieser Methode können Sie schnell die Funktionen finden, die am meisten zur Größe der Bibliothek beitragen.
Im Fall der Bibliothek, die ich hatte, die das gleiche Problem hatte, wandte sich die Ursache eine sehr große Templat-Funktion heraus, die jedes Mal, wenn ein Mitglied Variable gespeichert wurde instanziiert wurde. Die Lösung bestand in diesem Fall darin, die Funktion so zu konkretisieren, dass der gesamte Code, der kein typspezifisches Verhalten erfordert, nur einmal instanziiert wird und die Template-Funktionen für die typspezifischen Bit-Bits lokalisiert werden.
Ich bezweifle, ob dies mit aktuellen Tools möglich ist. – iammilind
Clang bietet eine übersichtliche Infrastruktur zum Schreiben verschiedener Quellenwerkzeuge. Sie können damit ein eigenes Werkzeug entwickeln. – arrowd
es würde variieren, wenn Sie Optimierungen verwenden – Zaffy