首页 > 代码库 > size_type与size_t的机器无关性
size_type与size_t的机器无关性
1、首先说下这两者之间的区别:sizetype是容器定义的类型,其使用范围在容器内,即命名空间在容器内,如STL中string类有定义string::size_type类型,vector内同样定义有vector<int>:size_type类型,它们的定义并不重复,命名空间不同罢了。而size_t类型的命名空间是全局的命名空间,全局只有一个,不能再次重复定义。
2、那么它们是什么类型呢?
答案是不唯一的,或者说是不确定的。在win32平台下它们的定义都是unsigned int类型,在win64平台下它们的定义是unsigned long类型
3、stl为什么定义这两种类型?
在我看来,这里有两个理由:
(1)定义新的类型名字,一目了然,开发人员在使用容器或者需要记录其它长度或者下标值时,用这种类型的话一目了然,其它同组开发人员也可以很容易读懂其编写的代码,这就增加了程序的易读性。
(2)上面的原因很重要,但这并不是其定义新类型的根本原因,STL定义新类型是为了实现平台的无关性,即让开发人员写出的代码具有平台无关性,可以任意在其它平台上面移植而不会出现意想不到的错误或异常。
对于上面的第二个原因有很多的同学理解的并不透彻,下面我们就看一个百度百科里提到的很简单的例子:
#include <iostream> #include <string> using namespace std; int main(){ string s; intrc = s.find(/*.....*/); system("pause"); return 0; }
这样的代码在一般情况下是不会出问题的,因为大多数的开发都在32位平台下开发,对应的int和s.find()返回值类型相同,都是32位int类型,但是加入把上面程序放在win64平台运行的话就会出现意想不到的效果。程序很可能会崩溃。s.find()返回值为64位的unsigned long类型,显然程序有问题了。
为了避免这种情况我们应该使用统一的类型,在win32下rc应该是32位整形,在win64下rc应该是64位整形。因此rc类型应该随平台的改变而改变。这就明显需要我们定义该类型为size_t类型啦。明白了吗?