C++中的size_t和int有什么区别?

vom3gejh  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(103)

此问题在此处已有答案

Where do I find the definition of size_t, and what is it used for?(9个回答)
59分钟前关闭
在几个C++示例中,我看到使用了size_t类型,而我本来应该使用简单的int。有什么区别,为什么size_t应该更好?

dkqlctbz

dkqlctbz1#

来自友好的维基百科:
stdlib. h和stddef. h头文件定义了一个名为size_t的数据类型,用于表示对象的大小。接受size的库函数期望它们是size_t类型,而sizeof运算符的计算结果是size_t。
size_t的实际类型与平台相关;一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误,特别是当64位架构变得更加流行时。
另外,检查Why size_t matters

7lrncoxx

7lrncoxx2#

size_t**1)**是用于表示大小的数据类型(顾名思义),**2)是平台(甚至可能是实现)相关的,因此它应该 * 仅用于表示大小。
表示大小,size_t自然是无符号的(你能有一个负3米宽的盒子吗?)许多stdlib函数,包括mallocsizeof和各种字符串操作函数都使用size_t作为数据类型。
默认情况下,int是有符号的,尽管它的大小也取决于平台,但在大多数现代机器上它将是固定的32位(尽管size_t在任何64位架构上都是64位,但int * 在这些相同的64位架构上保持 * 32位长)。

摘要:使用size_t表示对象的大小,在其他情况下使用int(或long)。请注意,size_t是无符号的,而intlong默认情况下都是有符号的(除非前缀为unsigned,或修改为uintulong)。

r6vfmomb

r6vfmomb3#

size_t类型定义为sizeof运算符的无符号整数类型。在真实的世界中,您经常会看到int定义为32位(为了向后兼容),但size_t定义为64位(因此您可以声明大小超过4 GiB的数组和结构)。如果long int也是64位的,则称为LP 64约定;如果long int是32位,而long long int和指针是64位,那就是LLP 64。你也可能得到相反的结果,一个程序使用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位寄存器和地址; IBM的大型机有15位、24位或31位的地址,在嵌入式系统中,你仍然可以看到不同的ALU和地址总线大小。
任何时候int小于size_t,并且您试图将非常大的文件或对象的大小或偏移量存储在unsigned int中,都有可能溢出并导致错误。对于int,也有可能得到负数。如果intunsigned int更宽,程序将正确运行,但会浪费内存。
如果你想要可移植性,你应该使用正确的类型。很多人会建议你使用有符号数学而不是无符号数学(以避免像1U < -3这样的讨厌的,微妙的错误)。为此,标准库在<stddef.h>中定义了ptrdiff_t作为从另一个指针减去指针的结果的有符号类型。
也就是说,一个解决方案可能是对INT_MAX0INT_MIN进行边界检查,并在比较有符号和无符号数量时打开编译器警告,以防您错过任何一个。无论如何,您应该始终始终检查C中的数组访问是否溢出。

mrphzbgm

mrphzbgm4#

这是因为size_t可以是int以外的任何值(可能是结构体)。其思想是它从底层类型继承了它的工作。

ibrsph3r

ibrsph3r5#

SIZE_T的定义见:https://msdn.microsoft.com/en-us/library/cc441980.aspxhttps://msdn.microsoft.com/en-us/library/cc230394.aspx

此处粘贴所需信息:

SIZE_TULONG_PTR,表示指针可以指向的最大字节数。
此类型声明如下:

typedef ULONG_PTR SIZE_T;

字符串
ULONG_PTR是用于指针精度的无符号长类型。当将指针强制转换为长类型以执行指针算术时使用它。
此类型声明如下:

typedef unsigned __int3264 ULONG_PTR;

相关问题