为什么size_t更好?

时间:2011-10-21 13:43:56

标签: c implementation size-t

标题实际上有点误导,但我想保持简短。我已经读过为什么我应该使用size_t,我经常发现这样的陈述:

  

size_t保证能够表达任何对象的最大大小,包括任何数组

我真的不明白这意味着什么。是否可以一次分配多少内存,并且size_t保证足够大以计算该内存块中的每个字节?

  

后续问题:
  What determines how much memory can be allocated?

6 个答案:

答案 0 :(得分:9)

假设您的编译器/平台可以拥有的最大对象是4 GB。 size_t然后是32位。现在假设您在64位平台上重新编译您的程序,该平台能够支持大小为2 ^ 43-1的对象。size_t将至少为43位长(但通常在此时为64位)。关键是你只需要重新编译程序。您不必将int更改为long(如果int为32位且long为64位),或者从int32_t更改为int64_t {1}}。 (如果你问自己为什么43位,让我们说Windows Server 2008 R2 64bit不支持大小为2 ^ 63的对象,也不支持大小为2 ^ 62的对象......它支持8 TB可寻址空间。那么43位!)

许多为Windows编写的程序认为指针与DWORD(32位无符号整数)一样大。如果不重写大型代码,则无法在64位上重新编译这些程序。如果他们使用DWORD_PTR(一个无符号值保证包含指针所需的大小),他们就不会遇到这个问题。

size_t“点”是相似的。 但不同

size_t无法保证能够包含指针!!
(Microsoft Windows的DWORD_PTR是)

这通常是非法的:

void *p = ...
size_t p2 = (size_t)p;

例如,在旧的DOS“平台”上,对象的最大大小为64k,因此size_t需要为16位 BUT 需要至少指针远的指针20位,因为8086的内存空间为1 mb(最后一个远指针是16 + 16位,因为8086的内存是分段的)

答案 1 :(得分:6)

基本上它意味着size_t保证足够大以索引任何数组并获得任何数据类型的大小。

优于仅使用int,因为int和其他整数类型的大小可以小于可以索引的大小。例如,int通常是32位长,这不足以索引64位计算机上的大型数组。 (当将程序移植到64位时,这实际上是一个非常常见的问题。)

答案 2 :(得分:3)

这正是原因所在。 给定编程语言中任何对象的最大大小由OS,CPU体系结构和正在使用的编译器/链接器的组合决定。

size_t被定义为足以容纳最大可能对象的大小值。

这通常意味着size_t的typedef与最大的int类型相同。 因此,在32位环境中,它通常是4个字节,在64位系统中是8个字节。

答案 3 :(得分:2)

size_t是为您要编译的平台定义的。因此,它可以代表该平台的最大值。

答案 4 :(得分:2)

size_t是sizeof运算符的返回值(见7.17 c99),因此它必须描述系统可以表示的最大可能对象。

答案 5 :(得分:-1)