size_t浅析

来源:互联网 发布:检查淘宝宝贝是否降权 编辑:程序博客网 时间:2024/06/08 10:24

    • 引子
    • 浅析
    • 总结

引子

在开始阅读linux内核或其它c/c++源码时,我们常常会遇到size_t这样的数据类型,往往我们并没有在意,就把它等价成了unsigned int型,也不影响我们的阅读。那为什么要定义这个新的数据类型呢,大多数人都知道是为了方便程序的移植,可是怎么就方便程序的移植了呢?请看下面的具体分析。

浅析

之所以定义size_t,是用来定义表示数组索引变量的数据类型,下面来看一个例子:

malloc (size_t n){  return __libc_memalign (sizeof (double), n);}

这个内存分配的函数大家肯定都十分熟悉,那大家有没有思考过n的取值范围呢?显然n不可能是负数,能否等于零我们现在也不关心,我们关心的是n最大可以是多少。如果n大于了系统指针变量的最大寻址范围,那么超过这个范围的地址就没有办法被访问到了。因此,n的范围最好适应于一个系统的指针变量寻址的最大范围。

最近,我看到了一篇文章,作者讲述了一种标记方法,来简明地表述不同目标平台下c语言数据类型的实现。该文章的作者页还没有找到这个标记的来源,这个标记语法甚至连一个名字都没有,但标记似乎很简单,即使没有正规的定义也可以很容易使用起来。这些标记的一边形式形如:I nI L nL LL nLL P nP。

其中每个大写字母代表一个C的数据类型,每一个对应的n是这个类型包含的位数。I代表int,L代表long,LL代表long long,以及P代表指针(指向数据,而不是函数)。每个字母和数字都是可选的。

如果大家没有理解上一段的叙述,直接看下面的例子:

架构标记 含义 I16P32 支持16位int和32位指针类型,没有指明是否支持long或者long long。 I16L32P32 支持16位int,32位long,和32位指针的架构。 IL32LL64P32 支持32位int,32位long,64位long long和32位指针的架构。

前面说过

n的范围最好适应于一个系统的指针变量寻址的最大范围

因此,在I16L32P32 架构的系统上,我们倾向于这样的定义:

# define size_t unsigned long

或者

typedef unsigned long size_t

而在I32L64P32架构的系统上,则定义为:

#define size_t unsigned int

或者

typedef unsigned int size_t

因此,在一个兼容性强的程序之中,会有一些条件编译语句,来申明不同系统下size_t的不同含义,这样就方便了程序的移植。

总结

总之,定义size_t的数据类型的本意,就是为了描述一个表示数组(或者其它单位)大小的变量。例如sizeof函数返回的结果往往就被定义为size_t类型。类似的还有wchar_t, ptrdiff_t。

size_t的定义,可能会出现在 stddef.h,stddef.h, stdio.h,stdlib.h,string.h,time.h 以及 wchar.h 等头文件的一个或几个之中。它也在对应的C++头文件中出现过,如 cstddef,cstdio 等等。

当你以后遇到size_t的时候,你马上就应该知道它代表一个字节的大小,或者是代表一个索引。

综上可知,类似于”size_t与平台无关“,”size_t就是unsigned int“,”32位系统下size_t就是32位,64位下size_t就是64位“等说法是不准确的。

参考文献:
【1】http://blog.csdn.net/wdjhzw/article/details/39452815
【2】http://www.embedded.com/electronics-blogs/programming-pointers/4026076/Why-size-t-matters

0 0
原创粉丝点击