Auf einem 64-Bit-System hängt sizeof(unsigned long)
vom vom System implementierten Datenmodell ab. Beispielsweise sind es 4 Byte unter LLP64 (Windows) und 8 Byte unter LP64 (Linux usw.). Was soll sizeof(size_t)
sein? Variiert es mit dem Datenmodell wie sizeof(long)
? Wenn das so ist, wie?
Verweise:
size_t wird vom C-Standard als vorzeichenloser Integer-Rückgabetyp des Operators sizeof (C99 6.3.5.4.4) und als Argument von malloc und friends (C99 7.20.3.3 usw.) definiert. Der tatsächliche Bereich wird so eingestellt, dass das Maximum (SIZE_MAX) mindestens 65535 beträgt (C99 7.18.3.2).
Dies lässt uns jedoch nicht sizeof (size_t) bestimmen. Der Implementierung steht es frei, eine beliebige Darstellung für size_t zu verwenden - daher gibt es keine Obergrenze für size -, und der Implementierung steht es auch frei, ein Byte als 16-Bit zu definieren. In diesem Fall kann size_t einem vorzeichenlosen Zeichen entsprechen.
Abgesehen davon haben Sie jedoch im Allgemeinen 32-Bit-size_t für 32-Bit-Programme und 64-Bit für 64-Bit-Programme, unabhängig vom Datenmodell. Im Allgemeinen wirkt sich das Datenmodell nur auf statische Daten aus. Zum Beispiel in GCC:
`-mcmodel=small'
Generate code for the small code model: the program and its
symbols must be linked in the lower 2 GB of the address space.
Pointers are 64 bits. Programs can be statically or dynamically
linked. This is the default code model.
`-mcmodel=kernel'
Generate code for the kernel code model. The kernel runs in the
negative 2 GB of the address space. This model has to be used for
Linux kernel code.
`-mcmodel=medium'
Generate code for the medium model: The program is linked in the
lower 2 GB of the address space but symbols can be located
anywhere in the address space. Programs can be statically or
dynamically linked, but building of shared libraries are not
supported with the medium model.
`-mcmodel=large'
Generate code for the large model: This model makes no assumptions
about addresses and sizes of sections.
Sie werden feststellen, dass Zeiger in allen Fällen 64-Bit sind. und es hat wenig Sinn, 64-Bit-Zeiger zu haben, aber schließlich keine 64-Bit-Größen.
es sollte mit der Architektur variieren, da es die Größe eines Objekts darstellt. Also auf einem 32-Bit-System size_t
wird wahrscheinlich mindestens 32 Bit breit sein. Auf einem 64-Bit-System ist die Breite wahrscheinlich mindestens 64 Bit.
EDIT: Vielen Dank für die Kommentare - Ich habe es in C99-Standard nachgeschlagen, das in Abschnitt 6.5.3.4 heißt:
Der Wert des Ergebnisses ist implementierungsdefiniert und sein Typ (ein vorzeichenloser ganzzahliger Typ ) ist
size_t
, definiert in<stddef.h>
(und andere Header)
Also, die Größe von size_t
ist nicht spezifiziert, nur dass es ein vorzeichenloser Integer-Typ sein muss. Eine interessante Spezifikation findet sich jedoch in Kapitel 7.18.3 der Norm:
grenze von
size_t
SIZE_MAX 65535
Was im Grunde bedeutet, dass unabhängig von der Größe von size_t
, der zulässige Wertebereich liegt zwischen 0 und 65535, der Rest ist implementierungsabhängig.
size_t ist auf 64-Bit-Computern normalerweise 64-Bit