sizeof(size_t) 可以小于 sizeof(int) 吗?

Can sizeof(size_t) be less than sizeof(int)?

sizeof(size_t)可以小于sizeof(int)吗?

C and/or C++ 标准是否保证使用 unsigned int 进行数组索引总是安全的?

是的,sizeof(size_t)原则上可以小于sizeof(int)。我不知道有任何实现是这样的,很可能有 none。我可以想象一个 64 位 int 和 32 位 size_t.

的实现

但是使用 unsigned int 索引数组是安全的——只要索引的值在数组长度规定的范围内。 [] 运算符的参数只需要是一个整数。它没有转换为 size_t。它是根据指针算法定义的,其中 + 运算符有一个参数是指针,另一个参数是任何整数类型。

如果 unsigned intsize_t 宽,那么超过 SIZE_MAXunsigned int 索引值几乎肯定会导致问题,因为数组不是那么大。在 C++14 及更高版本中,明确禁止定义大于 SIZE_MAX 字节的类型(3.9.2 [compound.types] 第 2 段;C++17 中的第 6.9.2 节)。在早期版本的 C++ 和所有版本的 C 中,它没有被明确禁止,但任何理智的实现都不太可能允许它。

[C答案]

Can sizeof(size_t) be less than sizeof(int)?

是的。 size_t 的大小可以小于、大于或等于 int,因为它们的相对大小 sizes/ranges 未在 C 中指定 - 只有它们的 最小值 _MAX 值:65535、32767.

IMO,sizeof(size_t) < sizeof(int)unicorn。理论上的,没见过。

代码可以使用以下内容来检测此类小动物。

#include <limits.h>
#include <stddef.h>
#if SIZE_MAX < UINT_MAX
  #error Unexpected small size_t
#endif

Do the C and/or C++ standards guarantee that using unsigned int for array indexing is always safe?

在 C 中,第

示例:一个小数组只能容忍 [0 ... 2] 的索引 - 无论索引的类型如何 - 而不是 unsigned 的整个范围。一个巨大的数组可能是可索引的 [0 ... UINT_MAX*42ull],因此 unsigned 不能代表所有有效索引。

一个size_t的宽度足以索引所有数组。