问题:size_t类型始终是无符号的吗?例如,对于size_t x
,是否始终有x > = 0
?
是的。通常它被定义为类似下面这样的东西(在32位系统上):
typedef unsigned int size_t;
参考资料:
C++标准第18.1节定义了size_t
位于<cstddef>
中,该库在C标准中描述为<stddef.h>
。
C标准第4.1.5节将size_t
定义为sizeof
运算符结果的无符号整数类型。
operator new
使用size_t
作为参数进行定义,因此它应该是无符号的。 - Mehrdad Afsharisize_t
通常是64位,而int
仍可能是32位;这些都高度依赖于编译器。 - Christophsize_t
是一个至少16位的无符号整数类型(见第7.17节和7.18.3节)。此标准还建议,如果可能的话,size_t
不应该具有比long
更大的整数转换级别,即如果遵循此建议,则将size_t
强制转换为unsigned long
就不会出现问题。1989年的ANSI C标准(ANSI C)没有提及最小大小或推荐的转换级别。1998年的ISO C++标准(C++98)(以及C++0x的当前草案)参考了C标准。第18.1节如下所述:内容与标准的C库头文件
<stddef.h>
相同[...]
ISO/IEC 9899:1990的第7条和ISO/IEC 9899/Amd.1:1995的第7条描述的库在此后称为标准C库。
size_t
的部分应继承自ANSI C:除了正文和节号之外,C90和ANSI C的标准相同。我需要一份规范修订副本才能确定stddef.h
没有任何相关更改,但我怀疑这点。最小大小似乎是由stdint.h
引入,即C99。请还考虑C++98第1.2节中的以下引用:所有标准均可能进行修订, 并且基于本国际标准的协议方 被鼓励调查应用下面所指出的 最新版本的标准的可能性。
是的,size_t保证是无符号类型。
size_t应该遵循C标准的相同定义,在C++标准的多个地方,它意味着它是无符号的自然数(特别是在分配器模板参数定义中)。
在C++标准的第18.1节(ISO/IEC 14882 - 第一版1998-01-01)中:
表15列出了已定义类型:ptrdiff_t和size_t
3 内容与标准C库头文件相同,但以下更改: 4 宏NULL在此国际标准中是一个实现定义的C++空指针常量(4.10)。
在此国际标准中,宏offsetof接受一组受限制的类型参数。类型应为POD结构或POD联合(第9条)。将offsetof宏应用于静态数据成员或函数成员字段的结果是未定义的。 另请参见:子句5.3.3,Sizeof,子句5.7,加法运算符,子句12.5,自由存储区以及ISO C子句7.1.6。
哦,这太糟糕了:
vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
auto obj = arr[i];
auto next = arr[i+1];
}
现在考虑 arr 为空的使用情形。
ptrdiff_t
(或intrptr_t
)。对于长度小于PTRDIFF_MAX
的字符数组,std::ptrdiff_t
充当了std::size_t
的有符号对应类型:它可以存储任何类型的数组的大小,并且在大多数平台上,它与std::intptr_t
同义。参见:https://dev59.com/PlsW5IYBdhLWcg3wXmO5 - Andrewssize_t
不是有符号的size_t
。它只能保证支持有符号值-1,虽然在Posix上可能有效,但在Windows上它是一个无符号类型。 - Dwedit