Was ist sizeof(size_t) bei 32-Bit im Vergleich zu den verschiedenen 64-Bit-Datenmodellen?
Lesezeit: 3 Minuten
Auf einem 64-Bit-System sizeof(unsigned long) hängt vom vom System implementierten Datenmodell ab, z. B. 4 Bytes bei LLP64 (Windows), 8 Bytes bei LP64 (Linux usw.). Was ist sizeof(size_t) soll sein? Variiert es mit Datenmodell wie sizeof(long) tut? Wenn das so ist, wie?
size_t ist vom C-Standard als vorzeichenloser Integer-Rückgabetyp des sizeof-Operators (C99 6.3.5.4.4) und des Arguments von malloc und Freunden (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).
Damit können wir jedoch nicht sizeof(size_t) bestimmen. Der Implementierung steht es frei, jede beliebige Darstellung für size_t zu verwenden – es gibt also keine Obergrenze für die Größe – und die Implementierung kann auch ein Byte als 16-Bit definieren, in diesem Fall kann size_t äquivalent zu unsigned char sein.
Abgesehen davon haben Sie jedoch im Allgemeinen 32-Bit-size_t in 32-Bit-Programmen und 64-Bit in 64-Bit-Programmen, unabhängig vom Datenmodell. Im Allgemeinen wirkt sich das Datenmodell nur auf statische Daten aus; zum Beispiel im 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 macht schließlich wenig Sinn, 64-Bit-Zeiger, aber keine 64-Bit-Größen zu haben.
size_t kann nicht mit unsigned identisch sein char. 7.18.3.2 sagt das size_t muss einen Mindestwert von 65535 haben.
– Benutzer904963
26. März um 12:07 Uhr
Evan Teran
Sie sollte je nach Architektur variieren, da sie die Größe eines beliebigen Objekts darstellt. Also auf einem 32-Bit-System size_t wird wahrscheinlich mindestens 32 Bit breit sein. Auf einem 64-Bit-System wird es wahrscheinlich mindestens 64-Bit breit sein.
size_t ist normalerweise 64-Bit auf 64-Bit-Rechnern
beef2k
BEARBEITEN: Danke für die Kommentare – ich habe in der nachgesehen C99-Standarddie in Abschnitt 6.5.3.4 sagt:
Der Wert des Ergebnisses ist implementierungsdefiniert und sein Typ (an vorzeichenloser ganzzahliger Typ) ist size_tdefiniert in <stddef.h> (und andere Überschriften)
Also die Größe von size_t nicht angegeben, nur dass es sich um einen unsigned Integer-Typ handeln muss. Eine interessante Spezifikation findet sich jedoch im Kapitel 7.18.3 der Norm:
Grenze von size_t
SIZE_MAX 65535
Was im Grunde bedeutet, dass unabhängig von der Größe size_tder erlaubte Wertebereich liegt zwischen 0-65535, der Rest ist implementierungsabhängig.
14135200cookie-checkWas ist sizeof(size_t) bei 32-Bit im Vergleich zu den verschiedenen 64-Bit-Datenmodellen?yes
MSDN an Allgemeine Visual C++ 64-Bit-Migrationsprobleme ist hilfreich für Windows 64.
– Jonathan Leffler
24. April 2014 um 22:02 Uhr