Ich bin so verwirrt darüber size_t
. Ich habe im Internet gesucht und überall erwähnt, dass size_t
es sich um einen vorzeichenlosen Typ handelt, der nur nicht negative Werte darstellen kann.
Meine erste Frage lautet: Wenn es nur nicht negative Werte darstellt, warum verwenden wir nicht unsigned int
stattdessen size_t
?
Meine zweite Frage lautet: Sind size_t
und unsigned int
austauschbar oder nicht? Wenn nicht, warum dann?
Und kann mir jemand ein gutes Beispiel size_t
und kurz seine Arbeitsweise geben?
typedef /*This part is implementation dependent */ size_t;
Antworten:
Weil
unsigned int
ist nicht der einzige vorzeichenlose Integer-Typ.size_t
könnte jederunsigned char
,unsigned short
,unsigned int
,unsigned long
oderunsigned long long
, abhängig von der Implementierung.Sie sind aus dem oben erläuterten Grund nicht austauschbar
^^
.Ich verstehe nicht ganz, was Sie unter "seiner kurzen Arbeit" verstehen. Es funktioniert wie jeder andere vorzeichenlose Typ (insbesondere wie der Typ, für den es typisiert ist). Es wird empfohlen, diese zu verwenden,
size_t
wenn Sie die Größe eines Objekts beschreiben. Insbesondere dersizeof
Operator und verschiedene Standardbibliotheksfunktionen, wie z. B.strlen()
returnsize_t
.Bonus: Hier ist ein guter Artikel über
size_t
(und den eng verwandtenptrdiff_t
Typ). Es ist sehr gut begründet, warum Sie es verwenden sollten.quelle
size_t
ein seinunsigned char
? Ist das in dem Standard, dass es erlaubt ist? Ich meine mit dieser Idee, wie könnte man erwarten, dass jemandcalloc()
(und seine Familie)strlen()
usw. benutzt? Das kommt mir absurd vor.size_t
, im Standard wird ein "vorzeichenloser Integer-Typ" definiert, aber es muss nicht derselbe sein wie einer vonunsigned {char, short, int, long, long long}
.In C gibt es 5 Standard-Ganzzahltypen ohne Vorzeichen:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
mit verschiedenen Anforderungen an ihre Größen und Bereiche (kurz gesagt, der Bereich jedes Typs ist eine Teilmenge des Bereichs des nächsten Typs, aber einige von ihnen haben möglicherweise denselben Bereich).
size_t
ist eintypedef
(dh ein Alias) für einen vorzeichenlosen Typ (wahrscheinlich einer der oben genannten, aber möglicherweise ein erweiterter vorzeichenloser Ganzzahltyp , obwohl dies unwahrscheinlich ist). Dies ist der Typ, den dersizeof
Bediener angibt .Auf einem System kann es sinnvoll sein,
unsigned int
Größen darzustellen. auf einem anderen könnte es sinnvoller sein,unsigned long
oder zu verwendenunsigned long long
. (size_t
ist wahrscheinlich nicht entwederunsigned char
oderunsigned short
, aber das ist erlaubt).Der Zweck von
size_t
besteht darin, den Programmierer davon zu entlasten, sich Gedanken darüber zu machen, welcher der vordefinierten Typen zur Darstellung von Größen verwendet wird.Code, der
sizeof
Erträge voraussetzt,unsigned int
wäre nicht portabel. Code, der davon ausgeht, dass er a ergibt,size_t
ist eher portabel.quelle
unsigned int
,unsigned long
usw.), diesize_t
entspricht , auf dem an der Maschine abhängt , wird der Code ausgeführt? dh auf einer Maschinenarchitektur entspricht es,unsigned int
aber auf einer anderen Architektur entspricht esunsigned long
usw.?size_t
, vor allem , wenn zum Beispielunsigned long
undunsigned long long
die gleiche Größe haben .long
,long long
usw. Sie auf dem System abhängig: Wenn Sie einen Blick auf ,limits.h
Sie werden zumindest unter Unices sehen , dass der Maximalwert für ints auf der Wortgröße des Systems abhängt.size_t
hat eine spezifische Einschränkung.Zitat aus http://www.cplusplus.com/reference/cstring/size_t/ :
Es ist nicht austauschbar mit,
unsigned int
da die Größe vonint
vom Datenmodell angegeben wird. Beispielsweise verwendet LLP64 ein 32-Bitint
und ILP64 ein 64-Bitint
.quelle
size_t wird zum Speichern der Größe von Datenobjekten verwendet und kann garantiert die Größe jedes Datenobjekts enthalten, das von der jeweiligen C-Implementierung erstellt werden kann. Dieser Datentyp kann kleiner (in Anzahl der Bits), größer oder genau derselbe sein wie int ohne Vorzeichen.
quelle
Neben den anderen Antworten wird auch der Code dokumentiert und den Leuten mitgeteilt, dass Sie über die Größe von Objekten im Speicher sprechen
quelle
apple
ist ein Apfel , asize_t
ist eine Größe ...Der Typ size_t ist ein vorzeichenloser Integer-Basistyp der C / C ++ - Sprache. Dies ist der Typ des Ergebnisses, das vom Operator sizeof zurückgegeben wird. Die Größe des Typs wird so gewählt, dass die maximale Größe eines theoretisch möglichen Arrays eines beliebigen Typs gespeichert werden kann. Auf einem 32-Bit-System benötigt size_t 32 Bit, auf einem 64-Bit-System 64 Bit. Mit anderen Worten, eine Variable vom Typ size_t kann einen Zeiger sicher speichern. Die Ausnahme sind Zeiger auf Klassenfunktionen, dies ist jedoch ein Sonderfall. Obwohl size_t einen Zeiger speichern kann, ist es besser, für diesen Zweck einen anderen vorzeichenlosen Integer-Typ uintptr_t zu verwenden (sein Name spiegelt seine Fähigkeit wider). Die Typen size_t und uintptr_t sind Synonyme. Der Typ size_t wird normalerweise für Schleifenzähler, Array-Indizierung und Adressarithmetik verwendet. Der maximal mögliche Wert des Typs size_t ist die Konstante SIZE_MAX.
quelle
size_t
kann die Größe eines einzelnen Objekts speichern. Ein Zeiger kann auf ein beliebiges Byte eines beliebigen Objekts zeigen. Sie können ein System mit beispielsweise einem 64-Bit-Adressraum haben, der die Größe eines Objekts auf 2 ** 32-1 Byte begrenzt. Es gibt keine Garantie dafürsize_t
unduintptr_t
sind vom gleichen Typ.In einfachen Worten ist size_t plattform- und implementierungsabhängig, während unsigned int nur plattformabhängig ist.
quelle