C++ for 循环中索引变量的最佳类型是什么?

jan*_*b04 7 c++ types for-loop

关于这个主题已经有一些问题(1、2、3 。问题是,似乎没有一个明确的答案。有些答案建议( 1 , 2 ),有些答案建议( 1 , 2 )。其他选项包括、、或使用容器或成员类型。size_tptrdiff_tintuint32_tautodecltype.size()size_type

这个问题似乎不适合基于观点,但我认为事实并非如此。仅仅因为尚未就使用哪种类型达成共识,并不意味着不存在客观的答案。这是因为不同的选择不仅美观,而且实际上可以影响代码的行为。

例如,在循环条件中使用符号不匹配的索引变量类型将导致编译器警告,如下所示。此外,使用范围太小的类型可能会导致溢出,在有符号类型的情况下会导致 UB。同时,在某些情况下改变循环计数器类型可能会导致“疯狂的性能偏差”。

我还想找出最流行的(尽管不一定是最好的)创建 for 循环的方法,因此我使用 GitHub *搜索来查找。结果如下:

循环型 GitHub 上的代码结果计数(平均值;“手动”循环 + 基于范围)
for (int 15.8m
for (size_t 11.6m
for (auto 7.5m
for (uint32_t 2.3m
std::for_each 501k
for (ptrdiff_t 98.7k
for (decltype 77.5k

不同循环类型之间的出现次数肯定存在很大差异,但是,似乎没有明显的杰出领导者。

因此,我发布这个问题询问,在 C++ 的 for 循环中索引变量使用的最佳类型是什么,或者应该选择这种类型的规则或条件是什么?

*:GitHub 搜索工具每次都会为“代码结果”(计数)生成不同的结果,因此我对 26 个值进行了平均。由于搜索是基于文本的,因此它包括表单for (int i = 0; i < n; ++i)和的结果for (int i : vec)