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类型啦。明白了吗?




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值