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?
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