我正在分析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
。
那么是什么决定了最大数据对象的大小?
答案 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位无符号整数