192

在几个 C++ 示例中,我看到了size_t我会使用简单int. 有什么区别,为什么size_t应该更好?

4

5 回答 5

162

来自友好的维基百科

stdlib.h 和 stddef.h 头文件定义了一个名为size_t的数据类型,用于表示对象的大小。采用大小的库函数期望它们的类型为 size_t,并且 sizeof 运算符的计算结果为 size_t。

size_t 的实际类型取决于平台;一个常见的错误是假设 size_t 与 unsigned int 相同,这可能导致编程错误,尤其是在 64 位体系结构变得越来越普遍的情况下。

另外,检查为什么 size_t 很重要

于 2009-02-02T11:07:04.150 回答
38

size_t 是用于表示大小的类型(顾名思义)。它依赖于平台(甚至可能是实现),并且应该仅用于此目的。显然,表示一个大小,size_t 是无符号的。许多 stdlib 函数,包括 malloc、sizeof 和各种字符串操作函数都使用 size_t 作为数据类型。

默认情况下对 int 进行签名,尽管它的大小也取决于平台,但在大多数现代机器上它将是固定的 32 位(尽管 size_t 在 64 位架构上是 64 位,但 int 在这些架构上保持 32 位长)。

总结一下:在其他情况下使用 size_t 表示对象的大小和 int (或 long )。

于 2009-02-02T11:48:12.677 回答
16

size_t类型被定义为sizeof运算符的无符号整数类型。在现实世界中,您经常会看到int定义为 32 位(为了向后兼容),但size_t在 64 位平台上定义为 64 位(因此您可以声明大小超过 4 GiB 的数组和结构)。如果 along int也是 64 位,这称为 LP64 约定;如果long int是 32 位,但long long int指针是 64 位,那就是 LLP64。您也可能得到相反的结果,该程序使用 64 位指令来提高速度,但使用 32 位指针来节省内存。此外,int已签名和size_t未签名。

从历史上看,还有许多其他平台的地址比int. 事实上,在 70 年代和 80 年代初期,这种情况比较普遍:所有流行的 8 位微机都有 8 位寄存器和 16 位地址,而 16 位和 32 位之间的转换也产生了许多机器地址比他们的寄存器更宽。我偶尔还会在这里看到有关用于 MS-DOS 的 Borland Turbo C 的问题,它的巨大内存模式在 16 位 CPU 上以 32 位存储 20 位地址(但它可以支持 80386 的 32 位指令集);摩托罗拉 68000 有一个 16 位 ALU,带有 32 位寄存器和地址;有 15 位、24 位或 31 位地址的 IBM 大型机。您还可以在嵌入式系统中看到不同的 ALU 和地址总线大小。

Any time int is smaller than size_t, and you try to store the size or offset of a very large file or object in an unsigned int, there is the possibility that it could overflow and cause a bug. With an int, there is also the possibility of getting a negative number. If an int or unsigned int is wider, the program will run correctly but waste memory.

You should generally use the correct type for the purpose if you want portability. A lot of people will recommend that you use signed math instead of unsigned (to avoid nasty, subtle bugs like 1U < -3). For that purpose, the standard library defines ptrdiff_t in <stddef.h> as the signed type of the result of subtracting a pointer from another.

That said, a workaround might be to bounds-check all addresses and offsets against INT_MAX and either 0 or INT_MIN as appropriate, and turn on the compiler warnings about comparing signed and unsigned quantities in case you miss any. You should always, always, always be checking your array accesses for overflow in C anyway.

于 2017-10-16T06:52:11.473 回答
9

这是因为 size_t 可以是除 int 以外的任何东西(可能是结构)。这个想法是将其工作与底层类型分离。

于 2009-02-02T11:06:29.563 回答
-1

的定义SIZE_T位于: https ://msdn.microsoft.com/en-us/library/cc441980.aspx和https://msdn.microsoft.com/en-us/library/cc230394.aspx

在此处粘贴所需的信息:

SIZE_TULONG_PTR表示指针可以指向的最大字节数。

该类型声明如下:

typedef ULONG_PTR SIZE_T;

AULONG_PTR是用于指针精度的无符号长类型。在将指针转换为 long 类型以执行指针运算时使用它。

该类型声明如下:

typedef unsigned __int3264 ULONG_PTR;
于 2016-05-24T16:27:26.090 回答