STL源码剖析笔记三

二、内存空间的构造与初始化

       Allocator除了完成内存请求的分配之外,还在空间的构造与初始化方面做了一些重要的工作。C++中的类型有两类:内建类型(如int、char)和用户自定义类型。对内建类型的构造或初始化比较简单,只是一些简单的赋值操作,主要是诸如memset或memmove之类的操作。但是对于自定义类型就没有那么简单了,比如对一个类的实例进行构造并初始化,需要调用类的构造函数,而该类的构造函数还有可能调用其他类的构造函数,比如调用其父类的cotr或调用其成员对象的cotr。

       根据我们前面的分析,我们可以感觉到对于任意型别的构造与初始化不能用简单的、一致的方法进行实现,因为那样可能影响程序的效率。那么,我们可以这样的设计Allocator的构造实现,对于内建类型我们直接用内存操作类实现,对于用户自定义类型,我们调用它们的构造函数来实现。但是STL怎么判断内建类型与自定义类型呢?能想到就是在STL实现中加入对各种类型的判断,放心,内建类型还是有限的,另外对于自定义类型我们可以统一的认为它们需要通过构造函数来初始化。但是,似乎这样还是不够好,倒不是我们采取的方法不好,而是有一些类,其实非常的简单,它们的构造函数并不干什么事情,在这种情况下调用它们,没有什么意义。比如:

class MyClass

{

 public:

     MyClass(int a):m_x(a){}

private:

     int m_x;

}

当我们需要创建一个MyClass对象数组时,我们就需要调用10次构造函数,显然这是一种浪费,我们完全可以只调用一次,其他9次我们都调用内存处理函数来初始化。

        所以,在C++语言中存在着POD和trivial这样的概念。像上面提到的这种类型及其构造函数就是POD和trivial的,具体判断什么样的类型是POD的,什么样的构造函数、拷贝函数是trivial的,可以去源码剖析或一些网站中查询。这里只是为了说明确实有一些自定义类型,在拷贝构造时是没有必要调用构造函数来初始化的。所以,我们看见了SGI STL中出现了对对象构造拷贝的特殊处理,比如Construct、Uniinitialize、以及xxfill等函数的出现。

       另外,在c++中一直存在着一个问题,与上述类似的,当一个函数在返回一个对象的时候需要创建一个临时返回对象,虽然这种情况通过引用可以解决,但是有时我们确实必须要返回一个局部对象时,我们不可避免的遇到了这种效率低下的尴尬的情况,不可避免的需要调用拷贝构造函数来构造这个临时对象,据说gcc中已经使用了一些新的技术来解决这样的问题,希望MS的VS也能有所改进。

       对Allocator的总结:真是如书上所说,无处不见效率的体现,对于我们开发人员来说,完全去读源代码可能比较困难,也没有这么多时间,但是其主旨思想还是需要好好琢磨的,说不定哪一天在你的设计中可以用得上,比如Memory Pool、区分类型构造。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值