《STL源码剖析》学习笔记——空间配置

相信大多数人应该和我一样,对STL的认识是从使用它开始的。但是,这等利器都是双刃剑,不明原理地使用,往往会适得其反。举个例子来说,对vector进行增添或者删除之后,出于内存安全的考虑,原有的迭代器应该摒弃不用。或许,只有真正走进STL的源码,才能解答这些疑问。 《STL源码剖析》这本书的源码来自大名鼎鼎的SGI STL,它是相对来说可读性最高的一个版本。

从实现的角度来看,空间配置器是一切的基础。当我们使用各种容器,进行各种操作时, 空间配置器总是默默地在我们看不见的地方做出自己的贡献。

SGI STL对内存的使用可以用两个词形容,可能不太准确:奢侈、精打细算。这一切都是为了:效率。下面是我的几点拙见。

1、内存池(memory pool)的概念

在STL二级空间配置中,内存池的使用可谓奢侈。若在第一次使用时,你想要一个8bytes区块,STL会要得40个这样的 8bytes区块,其中一个给你用,19个挂到free-list的一号桶下面,剩余20个会放到内存池中,以供将来使用。这样做的好处是,以后分配内存会直接从内存池中分配,提高了效率。

2、将内存分配和对象的构造/析构分开

template <class T1, class T2>
inline void construct (T1* p, const T2& value) {
    new (p) T1(value);
}

template <class T>
inline void destroy(T* pointer) {
    pointer->~T();
}
这里只列出了第一种destroy方法,第二中可以析构掉一批对象。

这里通过new占位符,来进行单纯的对象构造,只需要传入之前分配好的内存池中的地址,就可以在它之上构造出T1对象。destroy方法只负责析构对象,内存不会同时被释放掉。这样做的好处是:可以避免进行频繁的对象构造/析构时,内存也随之不停地获取和释放,从而提高了速度。

3、联合体的使用

在free-list中,使用了联合体来实现其中的节点:

union obj {
    union obj * free_list_link;
    char client_data[1];
}
这种结构既可以连接下一个节点,也可以为客端提供区块。这种“一物二用”的思想这是节省到家了!

联合体的另一个传神使用是:

struct in_addr{
    union {
        struct {u_char s_b1, s_b2, s_b3, s_b4;} S_un_b;
        struct {u_short s_w1, s_w2;} S_un_w;
        u_long S_addr;
    } S_un;
};
这种结构用被用于windows socket编程中,存储IP。这样做的好处不言而喻。


未完待续......



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值