3

我在参考http://www.embedded.com/electronics-blogs/programming-pointers/4026076/Why-size-t-matterssize_t中分析了跨平台提供的可移植性。以下是我从中得出的一些观点。

  • size_t是一个typedef无符号整数类型。
  • 用于类型定义的数据类型size_t确保它足以访问最大数据对象的大小,但不会更大。

我无法理解最大数据对象是什么意思? 还请考虑我从该参考中获取的以下示例。

对于I16LP32他们声称的最大数据对象的大小可以是2^(32)-1. 因此,在这种情况下,如果我们使用 anunsigned int作为size_tinmemcpy函数的替代品。我们将处理器能力限制为2^(16)-1.

那么是什么决定了最大数据对象的大小呢?

4

2 回答 2

4

对象的最大可能大小由 C 实现所针对的体系结构的内存映射决定(原则上,和/或其他实现细节,但实际上就是这样做的)。

在包括当今使用的大多数系统的所谓“平面”内存模型上,这意味着对象几乎可以是整个地址空间的大小(资源允许),因此您希望size_t是指针。如果您的地址空间是 32 位,那么由于对象的每个字节都有不同的地址,因此您显然不能拥有大于 2^32-1 字节的对象(-1,因为空指针值“用完”一个地址,即保证不是任何对象的地址)。

在分段内存架构上,您的 C 实现可能可以寻址 2^32 字节的空间,但不允许单个对象跨越多个 16 位段,因此原则上size_t可以是 16 位类型。

就此而言,允许 C 实现者对 进行任意限制malloc,出于纯粹的恶作剧,它永远不会返回大于 2^24-1 字节的块。在编译器中具有相同的限制以防止该大小的静态或自动对象,size_t即使指针更大,也可以是 24 位类型。

You'd hope that no implementer would do this solely for the fun of it, but there might be practical reasons for that 24 bit limit to exist. For example if the implementation uses a maximum of 16MB RAM for dynamic allocations and a separate limit of 16MB for static objects, then no object could be bigger than 16MB but a pointer has to be at least 25 bits. Even in that case, I doubt that an implementer would bother making size_t a 24-bit type, it would most likely still be 32 bits. But the standard allows the implementer to choose what's best.

你说,“访问最大数据对象的大小就足够了,但不是更大”。它不能更大是不正确的。例如,如果平台的某些技术限制意味着任何对象都不能大于 2^31-1 字节,那么就不能说size_t必须是 31 位类型。它被允许为 32 位类型,因为所需要的只是它足够大。

于 2012-10-29T11:52:51.817 回答
0

由于size_t用于内存测量,它需要与指针大小相同。

32 位指针 --> 32 位无符号整数

64 位指针 --> 64 位无符号整数

于 2012-10-29T11:41:00.680 回答