Man darosi neaišku, kas yra size_t
C. Žinau, kad jį grąžina operatorius sizeof
. Bet kas tiksliai tai yra? Ar tai duomenų tipas?
Tarkime, turiu for
ciklą:
for(i = 0; i < some_size; i++)
Ar turėčiau naudoti int i;
ar size_t i;
?
Pagal 1999 m. ISO C standartą
(C99), size_t
yra nepasižymėtasis sveikasis skaičius
tipas, turintis ne mažiau kaip 16 bitų (žr. skyrelius 7.17 ir 7.18.3).
size_t
yra nežyminis duomenų tipas apibrėžtas keliuose C/C++ standartuose, pvz., C99 ISO/IEC 9899 standarte, kuris yra apibrėžtasstddef.h
.1 Jis gali gali būti importuojamas įtraukiantstdlib.h
, nes šis failas viduje sub apimastddef.h
.Šis tipas naudojamas vaizduoti objekto dydį. Bibliotekos funkcijos kurios priima arba grąžina dydžius, tikisi jų būtų tipo arba turėtų grąžinimo tipą iš
size_t
. Be to, labiausiai dažnai naudojamos kompiliatoriumi pagrįstos operatorius sizeof turėtų būti vertinamas kaip pastoviąją vertę, kuri yra suderinama susize_t
.
Iš to išplaukia, kad size_t
yra tipas, garantuojantis, kad jame telpa bet koks masyvo indeksas.
size_t
yra nepasižymėtasis tipas. Todėl jis negali atvaizduoti neigiamų reikšmių (<0). Jį naudojate, kai ką nors skaičiuojate ir esate tikri, kad jis negali būti neigiamas. Pavyzdžiui, strlen()
grąžina size_t
, nes eilutės ilgis turi būti ne mažesnis kaip 0.
Jūsų pavyzdyje, jei jūsų ciklo indeksas visada bus didesnis už 0, gali būti prasminga naudoti size_t
arba bet kurį kitą nepasižymėtąjį duomenų tipą.
Kai naudojate size_t
objektą, turite įsitikinti, kad visuose kontekstuose, kuriuose jis naudojamas, įskaitant aritmetiką, norite turėti neneigiamas reikšmes. Pavyzdžiui, tarkime, kad turite:
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
ir norite rasti str2
ir str1
ilgių skirtumą. Jūs negalite to padaryti:
int diff = s2 - s1; /* bad */
Taip yra todėl, kad diff
priskirta reikšmė visada bus teigiamas skaičius, net ir tada, kai s2 < s1
, nes skaičiavimai atliekami su nepaskirstytaisiais tipais. Šiuo atveju, priklausomai nuo to, koks yra jūsų naudojimo atvejis, jums gali būti geriau naudoti int
(arba long long
) kaip s1
ir s2
.
C/POSIX sistemoje yra funkcijų, kurios galėtų ir turėtų naudoti size_t
, tačiau dėl istorinių priežasčių to nedaro. Pavyzdžiui, antrasis funkcijos fgets
parametras turėtų būti size_t
, tačiau jis yra int
.