2015-12-26 5 views
6

Frage ist ganz einfach.ist std :: size_t 4 Bytes auf 32-Bit-Systemen, wenn unsigned long long 8 Bytes sowohl 32-Bit- und 64-Bit-Systeme?

Auf 32-Bit-Systeme:

std::cout << sizeof(unsigned int);  //4 
std::cout << sizeof(unsigned long long); //8 
std::cout << sizeof(std::size_t);   //4 

Auf 64-Bit-Systeme:

std::cout << sizeof(unsigned int);  //4 
std::cout << sizeof(unsigned long long); //8 
std::cout << sizeof(std::size_t);   //8 

Ich habe nur die Implementierung, die MSVC hat, und es sieht wie folgt aus:

#ifdef _WIN64 
    typedef unsigned __int64 size_t; 
#else 
    typedef unsigned int  size_t; 
#endif 

Warum machen std::size_t nicht unsigned long long (std::uintmax_t) sowohl auf 32-Bit- und 64-Bit-sy Stiele, wenn sie es deutlich unterstützen? Oder liege ich falsch darin?

+3

size_t sollte der effizienteste Typ sein, der groß genug ist, um die Größe des größtmöglichen Objekts zu halten. Auf einem 32-Bit-System ist dies eine 32-Bit-Ganzzahl ohne Vorzeichen. 64-Bit ist auf einem 32-Bit-System weniger effizient. (Selbst auf x86-64 ist 64 Bit eine triviale Menge weniger effizient als 32 Bit, aber 32 Bit ist nicht groß genug für die Größe von Objekten mit maximaler Größe). Im 32-Bit-Modus ist 64-Bit-Unsigned selbst bei einer 64-Bit-CPU weniger effizient als 32-Bit. – JSF

Antwort

8

Der Punkt size_t ist in der Lage sein, die Größe des größten möglichen Objekts zu halten. Auf einem 32-Bit-System kann kein Objekt mehr als 2 ** 32 Bytes belegen, so dass ein 32-Bit-Typ ist ausreichend.

Die Verwendung eines 64-Bit-Typs wäre sehr platzintensiv und in der Laufzeit möglicherweise teurer.

6

Das ist eine sinnlose Verschwendung wäre. Auf einer 32-Bit-Maschine haben Sie einen 4-GB-Adressraum, so dass Sie keine Objekte größer als 4 GB haben können, so dass die Reichweite eines 32-Bit-size_t völlig ausreichend ist.

Verwandte Themen