wake-up-neo.com

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

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:

64-Bit-Datenmodelle auf Wikipedia

42
anonymous

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.

52
bdonlan

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.

10
Evan Teran

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.

4
beef2k

size_t ist auf 64-Bit-Computern normalerweise 64-Bit

4
adwords