问题很简单.
在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位系统上的std :: size_t unsigned long long(std :: uintmax_t)呢?或者我错了吗?
解决方法
size_t的要点是能够保持最大可能对象的大小.在32位系统上,没有对象可以占用超过2 ** 32个字节,因此32位类型就足够了.
使用64位类型会浪费空间并且可能在运行时更昂贵.