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 int
比 size_t
宽,那么超过 SIZE_MAX
的 unsigned 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
的宽度足以索引所有数组。
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 int
比 size_t
宽,那么超过 SIZE_MAX
的 unsigned 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 thansizeof(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
的宽度足以索引所有数组。