我只是想知道我是否应该使用std::size_t for循环之类的东西,而不是int? 例如:

#include <cstdint>

int main()
{
    for (std::size_t i = 0; i < 10; ++i) {
        // std::size_t OK here? Or should I use, say, unsigned int instead?
    }
}

一般来说,关于何时使用std::size_t的最佳实践是什么?


当前回答

一个很好的经验法则是,对于需要在循环条件中与std::size_t本身的东西进行比较的任何东西。

std::size_t是任何sizeof表达式的类型,as被保证能够在c++中表示任何对象(包括任何数组)的最大大小。通过扩展,它也保证足够大,可以用于任何数组下标,因此它是数组上按下标循环的自然类型。

如果你只是数到一个数字,那么使用保存该数字的变量类型或int或unsigned int(如果足够大)可能更自然,因为这些应该是机器的自然大小。

其他回答

Size_t是一个无符号整型,它可以表示系统中最大的整数。 只有当你需要非常大的数组,矩阵等。

有些函数返回size_t,如果你试图进行比较,编译器会警告你。

通过使用适当的有符号/无符号数据类型或简单的类型转换来避免快速破解。

使用std::size_t对c风格数组进行索引/计数。

对于STL容器,你会有(例如)vector<int>::size_type,它应该用于索引和计数vector元素。

实际上,它们通常都是无符号整型,但这并不能保证,特别是在使用自定义分配器时。

很快,大多数计算机将是64位体系结构,带有64位操作系统,运行在数十亿个元素的容器上的程序。然后必须使用size_t而不是int作为循环索引,否则在32位和64位系统上,索引将在2^32:th元素处换行。

为未来做好准备!

Size_t由各种库返回,以指示该容器的大小非零。你用它当你得到一次:0

然而,在上面的例子中,循环size_t是一个潜在的错误。考虑以下几点:

for (size_t i = thing.size(); i >= 0; --i) {
  // this will never terminate because size_t is a typedef for
  // unsigned int which can not be negative by definition
  // therefore i will always be >= 0
  printf("the never ending story. la la la la");
}

使用无符号整数有可能产生这类微妙的问题。因此,依我之见,我更喜欢只在与需要size_t的容器/类型交互时使用size_t。

Size_t是一种非常易读的方式来指定项的大小维度——字符串的长度,指针占用的字节数,等等。 它也可以跨平台移植——你会发现64位和32位都可以很好地使用系统函数和size_t——这是unsigned int可能做不到的(例如,什么时候应该使用unsigned long