使用`size_t`作为计数器的类型

时间:2014-09-23 14:15:24

标签: c++ size-t

使用size_t代替intunsigned作为计数器的类型是否合适?

以下代码来自 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函数。)有什么区别吗?

1 个答案:

答案 0 :(得分:1)

size_t是一种适合计算数组中元素的类型,因此适用于任何基于数组的容器。但是,size_t在概念上不足以计算非基于数组的容器中的元素。 (例如,size_t不能保证足够宽以计算std::list的元素。)因此,在一般情况下,使用size_t作为通用计数器类型是不合适的。显而易见的例子是分段内存模型,在此模式下,与平台本身的容量相比,size_t可能很容易变得相对较窄。

如果你真的想要找到一个足够广泛的泛型类型,对于大多数现实案例来说,那也许是uintptr_t。同样,在这种情况下的选择是基于uintptr_t应该足够宽以计算任何可以适合记忆的事实的事实。但是,由于显而易见的原因,它可能仍然太小而无法计算更广泛的内容。

我还补充说,使用size_tunitptr_t这样的通用类型作为特定于应用程序的代码中的计数器可能会被视为一种可疑的编程习惯,因为它们无法传达任何特定于应用程序的语义。它们比面向通用计数器更加面向内存。