代码:
#include <iostream>
#include <type_traits>
int main() {
std::cout << "sizeof(size_t): " << sizeof(size_t) << std::endl;
std::cout << "sizeof(uint64_t): " << sizeof(uint64_t) << std::endl;
if constexpr (std::is_same_v<size_t, uint64_t>) {
std::cout << "size_t == uint64_t" << std::endl;
} else {
std::cout << "size_t != uint64_t" << std::endl;
}
}
结果:
sizeof(size_t): 8
sizeof(uint64_t): 8
size_t != uint64_t
编译器信息:
Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin21.6.0
Thread model: posix
size_t
不等于uint64_t
有什么原因吗?如果是,标准中是否特别提到了为什么会这样?
通常类型size_t
是类型unsigned long
的别名。
来自C标准(7.19通用定义<stddef.h>(
4用于size_t和ptrdiff_t的类型不应具有整数转换秩大于有符号长整型的转换秩,除非实现支持足够大的对象,使之成为必要。
注意类型unsigned long int
的秩等于类型signed long int
的秩。
另一方面,类型uint64_t
通常被定义为类型unsigned long long int
的别名。尽管这是实现定义的。
对于您的代码,显示的输出意味着sizeof( unsigned long int )
在所用系统上也等于8。
- 类型size_t是一种实现定义的无符号整数类型,其大小足以包含任何对象([expr.sizeof](的字节大小
- 推荐做法:除非需要更大的大小来包含所有可能的值,否则实现应该为ptrdif_t和size_t选择整数转换秩([conv.rank](不大于有符号长整型的类型
[support.types]