【问题标题】:Why is size_t better?为什么 size_t 更好?
【发布时间】:2011-10-21 13:43:56
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c implementation size-t


【解决方案1】:

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

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

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

size_t 不保证能够包含指针!!
(微软Windows的DWORD_PTR是)

这通常是非法的:

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

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

【讨论】:

  • 所以它是给定平台上可能的最大整数类型?
  • @Paul 不,你仍然可以有一个 128 位整数。但是如果 size_t 是 64 位,long 是 128 位(这是合法的,但我认为没有 128 位的编译器 long)你仍然不能 malloc(2^120)
  • 谢谢。我在这里发布了一个后续问题:stackoverflow.com/questions/7850482/…
  • @Paul 如果您的下一个问题是what type is guaranteed to be able to contain any pointer,请注意回复是void*ptrdiff_t 仅在同一数组的元素之间“有效”,而不是在绝对地址之间。
  • @Paul 我忘了...在 C99 中,您可以使用 intptr_t 来包含指针
【解决方案2】:

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

它比只使用int 更可取,因为int 和其他整数类型的大小可能小于可以索引的大小。例如int 通常是 32 位长,这不足以在 64 位机器上索引大型数组。 (这实际上是移植程序到 64 位时非常常见的问题。)

【讨论】:

    【解决方案3】:

    这正是原因。 给定编程语言中任何对象的最大大小由操作系统、CPU 架构和使用的编译器/链接器共同决定。

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

    这通常意味着 size_t 的类型定义为与可用的最大 int 类型相同。 所以在 32 位环境中它通常是 4 个字节,而在 64 位系统中是 8 个字节。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 嗯,它完美地回答了这个问题。也许谷歌可以轻松回答的问题也很愚蠢?但是没有愚蠢的问题,不是吗?
          • @cli_hlt 候选人愚蠢的问题:“核辐射会损害我的录像带收藏吗?” ;-)
          猜你喜欢
          • 1970-01-01
          • 2012-04-23
          • 2016-10-22
          • 2012-04-27
          • 2020-04-27
          • 1970-01-01
          • 2018-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多