使用 `size_t` 作为计数器的类型
Posted
技术标签:
【中文标题】使用 `size_t` 作为计数器的类型【英文标题】:Use `size_t` as the type for a counter 【发布时间】:2014-09-23 14:15:24 【问题描述】:使用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
函数中。)有什么区别吗?
【问题讨论】:
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_t
和 unitptr_t
这样的泛型类型作为计数器可能被认为是一种有问题的编程实践,因为它们不传达任何特定于应用程序的语义。它们比通用计数器更面向内存。
【讨论】:
以上是关于使用 `size_t` 作为计数器的类型的主要内容,如果未能解决你的问题,请参考以下文章