Un po' di pulizie...

Ciao a tutti
Intenzionato ad aggiungere una funzioncina, sono andato a pulire un po' il mio software del contatore Geiger, in cui non potevo più aggiungere neanche un byte senza che nascessero problemi.
Ho visto che c'erano ancora parecchie variabili String, nonostante una precedente pulizia che avevo fatto, e le ho semplicemente sostituite con char *, guadagnando circa 700 byte in flash e 122 byte in RAM.

Fatto questo, mi ha stupito un po' che, quando mi sono accorto che 3 variabili (trasformate anch'esse in char *) non erano più usate, le ho eliminate, ma non ho ottenuto alcuna diminuzione di memoria occupata. Eppure, quando le avevo trasformate da String a char *, avevo guadagnato 60 byte in FLASH e 18 byte in RAM! Vuol dire che il compilatore alloca spazio per le String anche se non vengono usate? E' solo una curiosità, sia chiaro, perché le ho eliminate tutte e mi sono ripromesso di non usarle più. :slight_smile:

C'è anche da considerare che fino a quando c'è l'uso della classe String, il compilatore la carica in memoria poi quando si toglie completamente il suo uso questa non viene più caricata in memoria anche se è impostata in un #include. Sarà anche questo?

Ah, potrebbe essere! Comunque la stava caricando per tre variabili che non venivano più usate…

Tutte le variabili dichiarate inizializzate o meno vengono rimosse se nel codice non vengono referenziate, questo sempre che tra gli argomenti del compilatore ci sia --gc-sections.

Sottoscrivo quel che dice@ Maurotec.
Le char* sono variabili standard, se non usate il compilatore le elimina.
Le String invece sono oggetti, e credo sia difficile per il compilatore capire se non sono usate, visto che potrebbero essere usate a runtime.

Se ne era parlato tanto tempo fa, gc significa garbage collector. Il linker deve risolvere i simboli ma quando trova solo un riferimento ad un simbolo non lo risolve lo elimina. Per esistere la variabile (simbolo) deve essere presente almeno due volte.

Certamente se creiamo istanza di classe tramite new, questo avverrà a run-time e quindi a compile-time non c'è alcun controllo. Ma se creiamo istanza nel modo classico otteniamo un un simbolo (la variabile) se questo simbolo viene incontrato più volte dal linker questo lo risolve, diversamente lo elimina.

Comunque faccio confusione qualche volta tra compile-time e run-time, poi ci ragiono un po su e mi riprendo. :slight_smile:

PS: questa è nuova l'icona ... della lista delle emoticon non lista. :slight_smile: