size_t可移植性概念

时间:2012-10-29 11:34:55

标签: c memory-management size portability memcpy

我正在分析size_t如何在参考http://www.embedded.com/electronics-blogs/programming-pointers/4026076/Why-size-t-matters中跨平台提供可移植性。以下是我从中得出的几点。

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

我无法理解最大数据对象的含义是什么?另请考虑我从该引用中获取的以下示例。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

你希望没有任何实现者会为了它的乐趣而单独使用 ,但可能存在24位限制存在的实际原因。例如,如果实现对动态分配使用最大16MB RAM,对静态对象使用单独限制16MB,则没有对象可能大于16MB但指针必须至少为25位。即使在这种情况下,我怀疑实现者会打扰使size_t成为24位类型,它很可能仍然是32位。但是标准允许实施者选择最好的。

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

答案 1 :(得分:0)

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

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

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