在几个C ++示例我看到使用size_t类型,我会使用一个简单的int。有什么区别,为什么为size_t应该会更好?

有帮助吗?

解决方案

友好维基百科

  

在stdlib.h中和STDDEF.H头文件定义了一个称为数据类型的为size_t 其用来表示对象的尺寸。称取尺寸库函数期望它们是size_t类型,和sizeof运算符的计算结果为为size_t。

     

为size_t的实际类型是依赖于平台的;一个常见的错误是假设为size_t是一样的无符号整型,其可以导致编程错误,特别是作为64位体系结构变得更普遍。

此外,检查为什么为size_t事项

其他提示

为size_t是用来表示大小(作为它的名字暗示的那样)的类型。其平台(甚至可能实现)相关的,且只能用于此用途。显然,代表一个长度size_t是无符号。许多STDLIB功能,包括malloc的,和的sizeof各种字符串操作功能用的size_t作为数据类型。

的int被默认签名,即使它的尺寸也依赖于平台的,这将是最先进的机器上的一个固定的32位(虽然为size_t是在64位体系结构64位,INT长久保持32位上的那些结构)。

要总结:使用的size_t表示在其他情况下的物体和INT(或长)的大小

这是因为为size_t可以比一个int(可能是结构)的任何其他。这个想法是,它分离它是从底层类型的作业。

size_t类型被定义为无符号整数类型的sizeof运算符。在现实世界中,经常会看到int定义为32个比特(用于向后兼容),但size_t定义为64位(因此可以声明数组和结构超过4 2GB的)在64位的平台。如果long int也是64位,这就是所谓的LP64约定;如果long int是32位,但long long int和指针是64位,这是LLP64。你也可能会得到相反的,使用速度64位指令,而32位指针节省内存的程序。此外,int签名并size_t是无符号的。

有在历史上许多其他平台,其中地址比int的天然大小更宽或更短。实际上,在70年代和80年代初期,这比不更常见:所有流行的8位微型计算机具有的8位寄存器和16位地址和16位和32位之间的过渡也产生了许多机器,有比他们更广泛的寄存器的地址。我偶尔还能看见的问题在这里有关Borland的Turbo C为MS-DOS,其巨大的存储器模式已经存储在32位的20位地址的16位CPU上(但是可以支持80386的32位指令集);摩托罗拉68000曾与32位寄存器和地址的16位的ALU;有IBM大型机与15位,24位或31位的地址。你也仍然可以看到在嵌入式系统中不同的ALU和地址总线的大小。

任何时间intsize_t小,你尝试存储大小或在unsigned int一个非常大的文件或对象的偏移,还有它可能溢出,并导致错误的可能性。随着int,有也越来越负数的可能性。如果intunsigned int较宽,程序将正确地运行,但浪费存储器。

如果你想可移植性通常你应该使用正确的类型为宗旨。很多人会建议你使用签署的数学,而不是无符号(避免讨厌的,微妙的错误一样1U < -3)。为了这个目的,标准库定义ptrdiff_t<stddef.h>作为有符号的类型从另一个中减去一个指针的结果。

这是说,一个解决办法可能是越界核对INT_MAX,要么0INT_MIN适当的所有地址和偏移,并打开有关比较签订的编译器警告和无符号数量万一你错过任何。你应该永远,永远,永远是检查你的阵列中的C访问溢出反正。

SIZE_T的定义是发现于: https://msdn.microsoft.com/en-us/library/cc441980。 ASPX https://msdn.microsoft.com/en-我们/库/ cc230394.aspx

<强>粘贴这里所需的信息:

SIZE_T是表示到其上指针可以指向的字节的最大数目的ULONG_PTR

此类型声明如下:

typedef ULONG_PTR SIZE_T;

一个ULONG_PTR是用于指针精度无符号长型。铸造的指针时,长型来执行指针运算时使用。

此类型声明如下:

typedef unsigned __int3264 ULONG_PTR;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top