e qui ti sbagli
pensi veramente che se dichiari tutte le variabili che sai che conterranno un numero minore di 255 come char risparmi spazio? pensi veramente che un boolean occupi un bit? ahi ahi ahi
purtroppo non è così, detta in parole povere, un processore ha una lunghezza di parola (23bit-64bit) precisa, le sue istruzioni assembly sono studiate per avere in input dei parametri che sono multipli o sottomultipli della parola. Ciò non toglie che la maggior velocità di esecuzione è ottenuta con calcoli che sono lunghi quanto la parola.
Se dichiari un boolean in realtà nel 99% dei casi stai dichiarando un int, sei te che poi lo "usi" come un interruttore true false
Anche i membri delle strutture, se non specificato diversamente, vengono allineati alla parola di sistema e opportunamente paddati.
Inoltre in C:
int è lungo quanto la parola,
long il doppio della parola
short mezza parola
char un quarto di parola
quando in assembly si effettua un calcolo almeno uno dei due operandi deve essere caricato in un registro (nel caso IA-32: EAX, EBX, ECX, ...) e il registro è grande quanto la parola. Quindi anche se tu carichi mezza parola hai cmq utilizzato un registro
da qui l'inutilità di cercare di risparmiare "spazio" in questo modo
scusate se non mi sono spiegato bene, ma è un argomento veramente vasto e complesso, ho solo dato spizzichi e bocconi