2010-01-18 10 views
12

Sfondo: il compilatore può inserire il riempimento in una struttura per rendere i membri più allineati. Ciò comporterà la dimensione della struttura maggiore della somma delle dimensioni dei suoi membri. Riordinare i membri della struttura in modo che possano fare il pacchetto migliore può rimuovere la necessità che il compilatore esegua il pad in questo modo e rendere la struttura più piccola, risparmiando memoria. Ho bisogno di ottenere quei risparmi di memoria.Come trovare tutte le strutture che potrebbero essere rese più piccole cambiando l'ordine dei membri

L'opzione di fallback è controllare ogni struttura a mano. Sto cercando un approccio automatico che possa ridurre lo sforzo.

Anche se riduce solo il numero di strutture da controllare a mano che potrebbero essere d'aiuto.

Quindi ad esempio un processo/strumento/etc che elenca tutte le strutture che sono più grandi della somma delle dimensioni dei loro membri, mentre non perfetto sarebbe comunque utile in quanto limiterebbe quelle che devono essere controllate manualmente .

Qualcuno sa di alcuni strumenti che possono fare questo o qualcuno può suggerire qualsiasi approccio che potrebbe aiutare.

p.s. Devo farlo su una base di codice C incorporata contenente oltre 1 milione di righe di codice.

+1

Molti compilatori hanno un'opzione per comprimere le strutture strettamente - su MSVC++ questo è '/ Zp', su gcc è' -fpack-struct'. Si noti che (1) questo interromperà la compatibilità ABI con altri codici e (2) la maggior parte delle CPU gestirà gli accessi ai dati non allineati più lentamente (o per niente su alcune architetture). –

risposta

10

pahole è un'utilità scritta per questo scopo specifico. Analizzerà i file oggetto compilati (compilati con il debug abilitato) e mostrerà i buchi della struttura.

+0

è tornato e hai svalutato te, dopo averlo usato per un po 'ora devo dire che pahole è fantastico –

1

È possibile scrivere un programma che a sua volta scrive un piccolo programma C per ogni permutazione dei campi nella struct e quando il programma di output viene compilato ed esegue le sue stampe con le dimensioni della struct. Questo diventerà poco pratico se il numero di campi diventa molto più grande di 10 o giù di lì.

+0

Questo non ha molto senso. In generale, i campi di ordinazione dal più grande al più piccolo generano un riempimento ottimale. –

+1

@Anon rimane vero se alcune dimensioni di tipo non sono potenze di due, ad esempio doppi estesi di 10 byte o anche 'char t [5]'? –

+0

Un array di 'char' dovrebbe essere ordinato con altri' char's - forse sarebbe più accurato dire che i campi dovrebbero essere ordinati in base ai requisiti di allineamento. –

1

CIL è un parser C robusto scritto in OCaml che capisce il riempimento delle strutture. Viene fornito con un programma di rilevamento C. Il riempimento è specifico della piattaforma, non dubito che tu lo sappia, ma avresti potuto renderlo più chiaro nella tua domanda. Il programma di rilevamento fornito con CIL rileva la dimensione dei tipi e l'algoritmo che CIL assume viene utilizzato per il riempimento delle strutture è che l'offset dell'n-esimo campo viene calcolato arrotondando per eccesso (offset del campo (n-1) -th + dimensione del campo (n-1) -th) al multiplo più vicino di (allineamento del campo n-esimo).

Sarebbe meno di 200 righe di OCaml per rendere lo strumento necessario, a partire da CIL. Ma potrebbero esserci ancora soluzioni migliori.

9

L'opzione di avviso gcc's -Wpadded può essere utilizzata per indicare quando una struttura viene riempita. Questo non ti dirà quando la struttura può essere ridotta, ma può aiutare a ridurre il lavoro.

+0

Mi sento un idiota per non aver già trovato questa opzione. –

Problemi correlati