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?


Verweise:

64-Bit-Datenmodelle auf Wikipedia

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

Benutzeravatar von Evan Teran
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

Benutzeravatar von beef2k
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.

1413520cookie-checkWas ist sizeof(size_t) bei 32-Bit im Vergleich zu den verschiedenen 64-Bit-Datenmodellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy