Ciao, per spiegare le dimensioni dei vari tipi di variabili ho fatto uno sketch d'esempio e tirato fuori i valori compilati.
c'è un risultato che non so spiegare:
lo sketch:
'type' prova[100];
void setup() {
for (int i = 0; i < 100; i++) prova[i] = i;
}
void loop() {
}
i risultati:
flash - ram - type
476 - 109 - bool e boolean
464 - 109 - byte
470 - 209 - int
484 - 409 - long
628 - 409 - float e double
La domanda è perchè c'è differenza nella flash tra l'uso di byte e bool? addirittura il byte occupa meno... pensavo fossero uguali!
dab77:
La domanda è perchè c'è differenza nella flash tra l'uso di byte e bool? addirittura il byte occupa meno... pensavo fossero uguali!
Perché byte e bool anche se occupano tutti e due un byte sono trattati in modo diverso dal codice, questo comporta l'uso di differenti istruzioni assembly con tutte le conseguenze del caso sull'occupazione della flash.
Non credo che siano trattati diversamente, credo che dab77 abbia qualche altro problema ...
Il seguente programma che usa byte :
byte pippo[100];
void setup() {
for (int i = 0; i < 100; i++) pippo[i] = i;
}
void loop() {}
da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)
Lo stesso programma, usando boolean :
boolean pippo[100];
void setup() {
for (int i = 0; i < 100; i++) pippo[i] = i;
}
void loop() {}
da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)
... ovvero ... esattamente gli stessi identici valori (IDE 1.0.6) e ... mi sembra anche normale dato che, in Arduino.h, nel core, si ha la seguente definizione :
typedef uint8_t boolean;
typedef uint8_t byte;
... ovvero, sia byte che boolean sono sempre un uint8_t
gpb01:
... ovvero ... esattamente gli stessi identici valori (IDE 1.0.6) e ... mi sembra anche normale dato che, in Arduino.h, nel core, si ha la seguente definizione :
Stesso tuo programma compilato con IDE 1.6.1
Byte ram 109 flash 656
bool ram 109 flash 668
Adesso come la mettiamo ?
Vado a verificare cosa combina la 1.6.x con i bool, se non mi ricordo male qualcosa era stato fatto di diverso rispetto alla semplice typedef che li dichiara entrambi come unsigned char.
Infatti nel IDE 1.6.x la toolchain è aggiornata e include la definizione dei bool del C++, nella vecchia toolchain erano solo simulati con la tydef pertanto potevano assumere qualunque valore e non solo 0 o 1 come previsto dal tipo boolean del C++.
In Arduino.h
typedef bool boolean;
typedef uint8_t byte;
In stdbool.h
/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
Pertanto si ritorna alla mia spiegazione, bool/boolean sebbene occupa un byte è trattato diversamente dal unsigned char/byte.
astrobeed:
Infatti nel IDE 1.6.x la toolchain è aggiornata e include la definizione dei bool del C++, nella vecchia toolchain erano solo simulati con la tydef pertanto potevano assumere qualunque valore e non solo 0 o 1 come previsto dal tipo boolean del C++
... e potevano aggiornare la toolchain senza fare 'sta stronxxxx ... visto che la typedef è a livello di core in Arduino.h
E da che mondo è mondo ... 0 == false, qualsiasi altra cosa == true
gpb01:
Non credo che siano trattati diversamente, credo che dab77 abbia qualche altro problema ...
Il seguente programma che usa byte :
byte pippo[100];
void setup() {
for (int i = 0; i < 100; i++) pippo[i] = i;
}
void loop() {}
da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)
Lo stesso programma, usando **boolean** :
boolean pippo[100];
void setup() {
for (int i = 0; i < 100; i++) pippo[i] = i;
}
void loop() {}
da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)
... ovvero ... esattamente gli stessi identici valori (IDE 1.0.6) e ... **mi sembra anche normale** dato che, in Arduino.h, nel core, si ha la seguente definizione :
typedef uint8_t boolean;
typedef uint8_t byte;
... ovvero, sia byte che boolean sono sempre un **uint8_t** :D
Guglielmo
Grazie per la prova! la cosa si fa interessante visto che ho utilizzato la 1.6.1 (ho dimenticato di dirlo..)
EDIT: ops, non avevo mica visto gli altri 6 messaggi scritti nel frattempo...
e potevano aggiornare la toolchain senza fare 'sta stronxxxx ... visto che la typedef è a livello di core in Arduino.h
Diciamo di si, però il bool C++ con gli oggetti utente assume un significato particolare, forse per questo motivo l'hanno incluso. Questo però è legato a avrlibc e non ad arduino che poi si è adattata.
Quindi nel core ci sarà qualcosa di simile a: typedef bool boolean
il tipo bool è presente anche nel c con le stesse caratteristiche del c++.
Il tipo _Bool è stato creato per aumentare la stabilità e portabilità del codice.
In primis ora si può scrivere codice quale:
if ( true == var )
mentre prima non si poteva, o meglio non era uno standard e perciò quel frammento di codice non era sicuro e perciò bisognava scrivere
if ( true == !(!var) )
Lo standard prevede anche che la dimensione di tale tipo sia di un bit, questo è una grande caratteristica ad esempio per essere usato per i flags.
Infatti essendo o 0 o 1 si ha la certezza che
flags = bool_activate << 1;
funzioni sempre.
Non solo, ma il compilatore potrebbe ottimizzare una struttura unendo più bool in un unico byte
struct a{
bool a;
bool b;
}
su architetture a 8 bit potrebbe avere dimensioni di solo un byte anziché 2 e in una a 32 bit un 4 byte anziché 8.Questo però dipende dal compilatore che si sta usando.