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

Posted

技术标签:

【中文标题】使用 `size_t` 作为计数器的类型【英文标题】:Use `size_t` as the type for a counter 【发布时间】:2014-09-23 14:15:24 【问题描述】:

使用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 函数中。)有什么区别吗?

【问题讨论】:

en.cppreference.com/w/cpp/types/size_t unsigned int vs. size_t的可能重复 编辑:与此问题无关的想法。在 C++11 中,在许多情况下使用自动和迭代器来避免做出此决定。 一个相关的问题是***.com/questions/24226483/… @NeilKirk 在这种情况下 auto 将派生一个签名类型。不是用户想要的...... 【参考方案1】:

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

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

我还要补充一点,在特定于应用程序的代码中使用诸如 size_tunitptr_t 这样的泛型类型作为计数器可能被认为是一种有问题的编程实践,因为它们不传达任何特定于应用程序的语义。它们比通用计数器更面向内存。

【讨论】:

以上是关于使用 `size_t` 作为计数器的类型的主要内容,如果未能解决你的问题,请参考以下文章

linux C中size_t和ssize_t的区别

需要同步增量计数器?

shared_ptr(作为局部变量返回)

基于第二个参数的不同值的计数

collections

collections库