问题很简单.
在32位系统上:
std::cout << sizeof(unsigned int); //4 std::cout << sizeof(unsigned long long); //8 std::cout << sizeof(std::size_t); //4
在64位系统上:
std::cout << sizeof(unsigned int); //4 std::cout << sizeof(unsigned long long); //8 std::cout << sizeof(std::size_t); //8
我只检查了MSVC的实现,它看起来像这样:
#ifdef _WIN64 typedef unsigned __int64 size_t; #else typedef unsigned int size_t; #endif
那么为什么不在32位和64位系统上make std::size_t
unsigned long long
(std::uintmax_t
),当它们明确支持它时?或者我错了吗?
关键size_t
是能够保持最大可能对象的大小.在32位系统上,没有对象可以占用超过2**32个字节,因此32位类型就足够了.
使用64位类型会浪费空间并且可能在运行时更昂贵.
那将是毫无意义的浪费.在32位计算机上,您有4 GB的地址空间,因此您不能拥有大于4 GB的对象,因此32位的范围size_t
是完全足够的.