为什么size_t更好?

Pau*_*nta 10 c implementation size-t

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

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

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

后续问题:
什么决定了可以分配多少内存?

xan*_*tos 9

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

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

size_t"点"是相似的.但不同!

size_t不能保证能够包含指针!!
(DWORD_PTRMicrosoft Windows的)

一般来说,这是非法的:

void *p = ...
size_t p2 = (size_t)p;
Run Code Online (Sandbox Code Playgroud)

例如,旧的DOS"平台"上,物体的最大尺寸是64K,所以size_t需要的是16位的BUT为至少20位需要一个远指针,因为8086具有1兆位存储器空间(在结束远指针是16 + 16位,因为8086的内存是分段的)

  • @Paul No.您仍然可以拥有128位整数.但是如果`size_t`是64位而'long`是128位(这是合法的但我不认为有编译器有128位`long`)你仍然不能`malloc(2 ^ 120)` (3认同)
  • @Paul我忘记了...在C99你可以使用`intptr_t`来包含一个指针 (3认同)

Mys*_*ial 6

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

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