size_t 的可变迭代规模

variable scale of iterating for size_t

对于给定的 size_t,迭代的最佳数据类型是什么?

void do_some_for(size_t);

当我使用 int,

void do_some_for(size_t const size) {
    for (int i = 0; i < size; i++) {
    }
}

好心的编译器这样警告我。

....c:36:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s; i++) {
                     ^

并在 int 之前放置 unsigned 以清除警告。

void do_some_for(size_t const size) {
    for (unsigned int i = 0; i < size; i++) {
    }
}

现在我的问题是最好(安全)的数据类型是什么?

我看到 stdint.h#SIZE_MAX 打印了这个,

18446744073709551615 // at least 16 bits, i know.

这显然等于 2^63 -1

我应该使用 unsigned long long int(C99) 吗?或者有什么动态的方法可以做到这一点?

Should I use unsigned long long int for that?

你不可能知道吧?你可能需要 32 位;你可能需要 64 位。 (在一台非常老的机器上你可能只需要 16 位。)

Or is there any dynamic way to do this?

有!在每个系统上都有一个特殊类型,具有系统特定的定义,保证是:

  • 无符号
  • 适当的大小来存储您可以在该系统上操作的任何对象的大小

而这个类型的名字当然是size_t.

所以你应该写

void do_some_for(size_t size) {
    for (size_t i = 0; i < size; i++) {
        ...
    }
}

你应该很好。