使用size_t
代替int
或unsigned
作为计数器的类型是否合适?
以下代码来自 C ++ Primer 。
size_t count_calls()
{
static size_t ctr = 0;
return ++ctr;
}
int main()
{
for (size_t i = 0; i != 10; ++i)
cout << count_calls() << endl;
return 0;
}
我知道size_t
对于大小,数组索引是一个很好的选择,但是当涉及到普通计数器时呢? (如count_calls
函数。)有什么区别吗?
答案 0 :(得分:1)
size_t
是一种适合计算数组中元素的类型,因此适用于任何基于数组的容器。但是,size_t
在概念上不足以计算非基于数组的容器中的元素。 (例如,size_t
不能保证足够宽以计算std::list
的元素。)因此,在一般情况下,使用size_t
作为通用计数器类型是不合适的。显而易见的例子是分段内存模型,在此模式下,与平台本身的容量相比,size_t
可能很容易变得相对较窄。
如果你真的想要找到一个足够广泛的泛型类型,对于大多数现实案例来说,那也许是uintptr_t
。同样,在这种情况下的选择是基于uintptr_t
应该足够宽以计算任何可以适合记忆的事实的事实。但是,由于显而易见的原因,它可能仍然太小而无法计算更广泛的内容。
我还补充说,使用size_t
和unitptr_t
这样的通用类型作为特定于应用程序的代码中的计数器可能会被视为一种可疑的编程习惯,因为它们无法传达任何特定于应用程序的语义。它们比面向通用计数器更加面向内存。