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代表指针(指向数据,而不是函数)。每个字母和数字都是可选的。
如果大家没有理解上一段的叙述,直接看下面的例子:
前面说过
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
- size_t浅析
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- size_t
- matlab调用C++文件
- 分享一种最简单的Android打渠道包的方法
- 求质因子的模板
- 常回顾 做备忘
- 第二周项目3时间类
- size_t浅析
- 谈谈团队合作中的设计与优化
- Redis集群原理3.0 官方文档 可用性、容错部分 持续更新
- [Thinking in JAVA] 关于内部类的一些知识点
- hdoj 2083 简易版之最短距离
- 蓝牙协议分析_基本概念
- halcon学习1---基于Qt的halcon环境配置
- PowerDesigner(一)-PowerDesigner概述(系统分析与建模)
- BlueTooth: 关于蓝牙你不可不知道的几个基础常识