Come da titolo: che differenze ci sono essenzialmente tra unsigned, size_t e size_type?
Quando è più corretto preferire l'utilizzo di uno piuttosto che di un altro?
Grazie.
Come da titolo: che differenze ci sono essenzialmente tra unsigned, size_t e size_type?
Quando è più corretto preferire l'utilizzo di uno piuttosto che di un altro?
Grazie.
unsigned è un int senza segno.
size_t è sinomino di unsigned int
size_type è sinonimo di size_t nei container STL.
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
In linea di massima:
unsigned {int/long/short/char} quando ti serve un intero senza segno, ad esempio per comunicare semanticamente che si tratta di un valore che non può mai essere negativo (anche se quest'uso da alcuni non è ben visto); viene usato spesso nelle strutture scritte su file.
size_t quando stai ragionando sulle dimensioni di un qualche oggetto (valori restituiti da sizeof) e, per estensione, volendo anche quando iteri su un array, visto che, se in un size_t ci possono stare le dimensioni dell'array, sicuramente ci starà anche l'indice di qualunque elemento, che è un loro sottomultiplo (occhio che se iteri *al contrario* su un array con tipi senza segno rischi di fare casino).
size_type per gli stessi usi, ma se stai lavorando su un container STL. In linea del tutto teorica size_t e i vari size_type potrebbero essere diversi, ma se non erro da qualche parte nello standard c'è qualche requisito che di fatto impone implicitamente che siano uguali.
Evita di usare un unsigned int "a caso" al posto di size_t/size_type, dal momento che non è detto che l'unsigned int che hai scelto sia abbastanza grande; inoltre, l'idea dietro a questi tipi "specializzati" è che abbiano anche un uso semantico, cioè, io vedo un size_t e so subito che non si tratta del numero di mele caricate su un camion, di un bitfield o di chissà cos'altro, ma che è la dimensione in byte di qualcosa o l'indice in un array.
No. size_t è un tipo senza segno che garantisce di poter specificare le dimensioni di qualunque variabile/tipo; lo standard C++ (§18.1.3) rimanda allo standard C per quanto riguarda size_t, e lì (§7.17.2) si dice cheOriginariamente inviato da shodan
size_t è sinomino di unsigned int
Non c'è nessuna garanzia che si tratti nello specifico di un unsigned int, si dice semplicemente che deve essere un intero senza segno (è più chiaro a §6.5.3.4.4:size_t [...] is the unsigned integer type of the result of the sizeof operator
, e sempre in §7.12 poco dopo si evince che non si specifica un rango di conversione particolare, ma che solitamente non dovrebbe essere sopra il long).The value of the result is implementation-defined, and its type (an unsigned integer type)
is size_t, defined in <stddef.h> (and other headers).
Amaro C++, il gusto pieno dell'undefined behavior.
Impeccabile. Però se lo spieghi a un niubbo attraverso lo standard, prima fa:, poi
e infine
![]()
![]()
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.
Verissimo. Infatti la prima parte era il "nitpicker corner"(a frequentare Stack Overflow si finisce ad essere sensibili a queste cose, credo che sia il primo sito dove ho usato il carattere §
), la seconda era la "vera" risposta. Comunque, ora le scambio, così la risposta risulta più comprensibile.
Amaro C++, il gusto pieno dell'undefined behavior.
Non c'è di che, ciao!Originariamente inviato da GliderKite
Grazie MItaly,
non potevi essere più chiaro!![]()
![]()
Amaro C++, il gusto pieno dell'undefined behavior.