C ++中size_t和int有什么区别?
在几个C ++示例中,我看到了size_ttypes的使用,我将使用一个简单的int。 有什么区别,为什么size_t应该更好?
从友好的维基百科 :
stdlib.h和stddef.h头文件定义了一个名为size_t的数据types,用于表示对象的大小。 需要大小的库函数期望它们是size_ttypes,并且sizeof运算符的计算结果是size_t。
size_t的实际types是平台相关的; 一个常见的错误是假定size_t与unsigned int相同,这会导致编程错误,特别是在64位体系结构变得更普遍的情况下。
另外,请检查为什么size_t很重要
size_t是用来表示大小的types(正如它的名字所暗示的那样)。 它的平台(甚至潜在的实现)是依赖的,只能用于这个目的。 显然,代表一个大小,size_t是无符号的。 许多stdlib函数,包括malloc,sizeof和各种string操作函数都使用size_t作为数据types。
一个int是默认签名的,即使它的大小也是平台相关的,在大多数现代机器上它将是一个固定的32位(尽pipesize_t在64位架构上是64位,int在这些架构上仍然是32位长)。
总结一下:在其他情况下,使用size_t来表示对象的大小,int(或long)。
这是因为size_t可以是除int以外的任何东西(也许是一个结构体)。 这个想法是将它从基础types中分离出来。
SIZE_T
的定义位于: https : //msdn.microsoft.com/en-us/library/cc441980.aspx和https://msdn.microsoft.com/en-us/library/cc230394.aspx
在此粘贴所需信息:
SIZE_T
是一个ULONG_PTR
表示一个指针可以指向的最大字节数。
这种types的声明如下:
typedef ULONG_PTR SIZE_T;
ULONG_PTR
是用于指针精度的无符号长整型。 在将一个指针指向一个长types来执行指针运算时使用它。
这种types的声明如下:
typedef unsigned __int3264 ULONG_PTR;
size_t
types被定义为sizeof
运算符的无符号整型。 在现实世界中,您经常会在64位平台上将int
定义为32位(为了向后兼容性),但将size_t
定义为64位(这样您可以声明大于4 GiB的数组和结构)。 如果long int
也是64位,这就是所谓的LP64惯例; 如果long int
是32位,但long long int
和指针是64位,这是LLP64。 你也可能会得到相反的结果,一个使用64位指令来提高速度的程序,但是32位指针来节省内存。 另外, int
是有符号的, size_t
是无符号的。
历史上有一些其他平台的地址比int
的本地大小更宽或更短。 事实上,在70年代和80年代初期,这种情况比较普遍:所有stream行的8位微型计算机都有8位寄存器和16位地址,在16位和32位之间的转换也产生了许多机器地址比寄存器要宽。 我偶尔还会在这里看到关于Borland Turbo C for MS-DOS的问题,它的巨大的内存模式有20位地址存储在16位CPU上的32位(但可以支持80386的32位指令集); 摩托罗拉68000有一个16位的ALU,带有32位寄存器和地址; 有IBM大型机15位,24位或31位地址。 在embedded式系统中,您仍然可以看到不同的ALU和地址总线大小。
任何时候int
都小于size_t
,并且你试图把一个非常大的文件或者对象的大小或者偏移量存储在一个unsigned int
,那么它就有可能溢出并导致一个bug。 有一个int
,也有可能得到一个负数。 如果int
或unsigned int
更宽,程序将正确运行但浪费内存。
如果你想要可移植性,你通常应该使用正确的types。 很多人会build议你使用有符号math而不是无符号数(以避免像1U < -3
这样的肮脏,微妙的错误)。 为此,标准库将<stddef.h>
中的ptrdiff_t
定义为从另一个指针中减去指针的结果的带符号types。
也就是说,一个解决方法可能是边界检查所有的地址和偏移INT_MAX
和0
或INT_MIN
适当,并打开编译器警告比较有符号和无符号的数量,如果你错过任何。 无论如何,你总是应该总是检查你的数组访问溢出。