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



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

C 和/或 C++ 标准是否保证使用unsigned int进行数组索引始终是安全的?

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

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

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

[C 答案]

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

是的。size_t的大小可以小于、大于或等于int,因为它们的相对大小/范围未在 C 中指定 - 仅指定其最小_MAX值:65535、32767。

IMO,sizeof(size_t) < sizeof(int)是独角兽。 理论上的,但看不到。

代码可以使用以下内容来检测此类野兽。

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

C 和/或 C++ 标准是否保证使用unsigned int进行阵列索引始终是安全的?

在 C 中,没有。

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

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

最新更新