题
在几个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和地址总线的大小。
任何时间int
比size_t
小,你尝试存储大小或在unsigned int
一个非常大的文件或对象的偏移,还有它可能溢出,并导致错误的可能性。随着int
,有也越来越负数的可能性。如果int
或unsigned int
较宽,程序将正确地运行,但浪费存储器。
如果你想可移植性通常你应该使用正确的类型为宗旨。很多人会建议你使用签署的数学,而不是无符号(避免讨厌的,微妙的错误一样1U < -3
)。为了这个目的,标准库定义ptrdiff_t
在<stddef.h>
作为有符号的类型从另一个中减去一个指针的结果。
这是说,一个解决办法可能是越界核对INT_MAX
,要么0
或INT_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;