Penso che molti strumenti di analisi statica potrebbero non darti quello che ti serve dato che non tengono necessariamente conto di cose come le istanze dei template, inclusioni di intestazione (comprese quelle tirato da intestazioni precompilate) e le caratteristiche di generazione del codice del compilatore.
Ho affrontato un problema simile in passato, con un grosso eseguibile le cui dimensioni erano dominate da una particolare libreria. Il modo in cui sono arrivato al fondo era semplicemente quello di guardare la dimensione dei file oggetto per ogni .cpp. Questo non ti darà tutta la storia, dal momento che il linker ottimizzerà le porzioni inutilizzate (anche se vale la pena di controllare che hai impostato l'opzione - /OPT:REF
per Visual Studio). Ti permetterà comunque di focalizzare la tua ricerca. Trova i due o tre file oggetto più grandi e poi guarda i corrispondenti file .cpp. Hai quindi due opzioni: scrivi uno script che prende l'output di objdump
(VisualStudio) o nm -C
(gcc) in cui puoi estrarre gli offset di ogni funzione nel modulo, in modo da poterli differire ciascuno con il precedente per avere un'idea della dimensione di ciascuna funzione.
Oppure il metodo più semplice è solo utilizzare la ricerca binaria sul file cpp. #ifdef tutto il codice dopo la fine del #include e compilarlo. Questo ti darà un'idea dell'overhead degli include (se questo è enorme allora puoi scavare nelle inclusioni dell'header per trovare quale contribuisca di più). Successivamente, disabilita ogni metà del codice con #ifdef e trova quale metà è il più grande. Utilizzando questo metodo è possibile trovare rapidamente le funzioni che contribuiscono maggiormente alle dimensioni della libreria.
Nel caso della libreria che ho avuto questo stesso problema, la causa si è rivelata essere una funzione di modello molto ampia che veniva istanziata ogni volta che veniva salvata una variabile membro. La soluzione in quel caso era di rendere la funzione concreta in modo tale che tutto il codice che non richiedesse un comportamento specifico del tipo venisse istanziato una sola volta e le funzioni del template fossero localizzate per i bit di logica che sono specifici del tipo.
fonte
2012-07-30 08:37:36
Dubito che ciò sia possibile con gli strumenti correnti. – iammilind
Clang offre un'infrastruttura pulita per la scrittura di vari strumenti di livello sorgente. Puoi usarlo per sviluppare il tuo strumento. – arrowd
potrebbe variare se si utilizzano le ottimizzazioni – Zaffy