问题很简单。
在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
)?或者我错了吗?
答案 0 :(得分:8)
size_t
的要点是能够保持最大可能物体的大小。在32位系统上,没有对象可以占用超过2 ** 32个字节,因此32位类型就足够了。
使用64位类型会浪费空间,并且在运行时可能会更加昂贵。
答案 1 :(得分:6)
那将是毫无意义的浪费。在32位计算机上,您有4 GB的地址空间,因此您不能拥有大于4 GB的对象,因此32位size_t
的范围是完全足够的。