std::size_t
是一种无符号类型,可以存储任何类型的理论上可能存在的最大对象的大小,而std::ptrdiff_t
是一种有符号类型,可以保存两个指针之间的差值(这另一种说法是它应该是C++中数组索引的标准整数)。C++标准库已经决定使用std::size_t
进行数组索引,但通常会声明std::ptrdiff_t
更好。哪一个更好是一个长期的争论,我不想在这里进入,但我一直认为第二个是第一个的无符号版本。在macOS上运行此程序会得到:
#include <cstddef>
#include <cstdio>
void f(int n) { std::printf("int"); };
void f(long n) { std::printf("long"); };
void f(long long n) { std::printf("long long"); };
void f(unsigned int n) { std::printf("unsigned int"); };
void f(unsigned long n) { std::printf("unsigned long"); };
void f(unsigned long long n) { std::printf("unsigned long long"); };
int main() {
const std::ptrdiff_t n_ptrdiff = 0;
const std::size_t n_size = 0;
std::printf("std::ptrdiff_t is an alias for ");
f(n_ptrdiff);
std::printf("\n");
std::printf("std::size_t is an alias for ");
f(n_size);
std::printf("\n");
return 0;
}
在 64 位平台上但编译为 32 位:
clang++ -m32 -std=c++11 type.cpp -o type-32-clang
给我以下结果:
std::ptrdiff_t is an alias for int
std::size_t is an alias for unsigned long
在这种情况下,即使它们具有相同的存储大小(4字节),
std::size_t
并不是std::ptrdiff_t
的无符号版本。尽管它符合标准,但对我来说似乎非常奇怪。有人知道选择这种方式的理由吗?
std::uintptr_t
。 - StoryTeller - Unslander Monicalong
的大小可以与一个int
相同。检查所有这些类型的sizeof
。 - Bob__