Sto lavorando su uno stack USB in C. Questo stack sarà open source e usato in vari progetti diversi.
Sono disponibili varie opzioni di configurazione che abilitano o disabilitano grandi blocchi di codice e strutture di dati costanti. Poiché si tratta di un progetto incorporato, è importante ridurre al minimo l'ingombro dello stack e uno dei vantaggi della disattivazione delle funzionalità non utilizzate è una riduzione dell'uso di memoria flash e RAM.
Ci sono due modi per rimuovere il codice non utilizzato dall'output del processo di compilazione. L'uso delle direttive del preprocessore #ifdef
fa sì che il compilatore non consideri nemmeno il codice inusato. Gli svantaggi principali sono l'inquinamento del codice con un sacco di #ifdefs
e il potenziale per rompere il codice disabilitato e non ottenere un avvertimento / errore del compilatore.
L'altra opzione è includere il codice ma consentire al linker di rimuoverlo. GCC è molto bravo in questo, e l'output risultante è della stessa dimensione come se fosse stato rimosso con #ifdef
. Il lato negativo di questo è che richiede almeno un livello minimo di ottimizzazione da abilitare ( -O1
, funzioni nelle sezioni e rimozione della sezione inutilizzata) e questo comportamento non è garantito su altri compilatori o su altre versioni di GCC.
Qual è la migliore pratica qui e perché? Quali sono i vantaggi e gli svantaggi che non ho considerato?