有没有将 size_t
定义为除了 unsigned int
以外的其他类型的实现?在我工作过的每个系统中,它都被定义为 unsigned int,所以我只是好奇。
size_t
定义为unsigned long
。(这是LP64模型。这种事情是平台的ABI的一部分,该ABI还定义了诸如函数调用约定等内容。其他架构可能会有所不同。)即使在这些操作系统上使用32位x86和ARM架构,也会使用unsigned long
,虽然在这种情况下long
恰好与int
具有相同的表示形式。unsigned __int64
/unsigned long long
。(它使用LLP64模型)http://en.cppreference.com/w/cpp/types/size_t
C++标准第18.2.6节
size_t
类型是实现定义的无符号整数类型,它足够大以包含任何对象的字节数。
对于Linux;“在Linux中c++ size_t的定义在哪里”给出 long unsigned int
(此问题最初标记为C和C++。)
可以查看这里的答案:
不能保证 size_t
被定义为任何“具体”的类型。实际上,如果你想查看不是 unsigned int
的系统,请参考例如我的机器(unsigned long
),因此大多数 64 位 GNU / Linux 系统。
来自 N4296 第 18.2.6 节:
size_t
类型是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的大小字节数。
并且在 N897(解释)6.5.3.4 中...
sizeof
的类型,无论它是什么,在库头文件<stddef.h>
中发布为size_t
,因为程序员能够引用此类型很有用。此要求隐式限制了size_t
成为现有无符号整数类型的同义词。请注意,尽管size_t
是无符号类型,但sizeof
不涉及任何算术操作或转换,即使大小过大而无法表示为size_t
,也不会导致模数行为,从而扼杀了最大可声明对象可能过大以至于 C89 中需要使用unsigned long
或 C9X 中需要使用uintmax_t
来跨越的任何概念。这也限制了可以在数组中声明的最大元素数量,因为对于任何具有N
个元素的数组a
,
N == sizeof(a)/sizeof(a[0])
因此,
size_t
也是数组大小的便捷类型,并在多个库函数中使用。
不是所有的size_t
都等同于unsigned int
。
根据C标准,6.5.3.4:
两个运算符的结果值由实现定义, 其类型(一个无符号整数类型)为
size_t
,定义在<stddef.h>
(和其他头文件)中。
根据C标准,size_t
是未定义的无符号整数类型。
64位和数据大小中性
...
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) = sizeof(size_t)
简单地说:
size_t
是 size_t
。不符合此规范的代码是错误的。
不,我只是在cpp.sh上运行了这个程序,它使用的是gcc:
#include <iostream>
int main()
{
std::cout << sizeof(unsigned int) << " " << sizeof(unsigned long) << " " << sizeof(size_t) << "\n";
}
然后它产生了这个输出:
4 8 8
unsigned int
,因此被称为size_t
。它是某些特定的C库调用所期望的一种类型,用于定义一个大小参数(例如缓冲区的长度)。即使你从未见过它以外的定义,也不要编写假定它是unsigned int
的代码。 - lurker