dreamer's house

Hold fast to dream, for if dream dies, life is a broken-winged bird that can't fly


« 上一篇: something is too complicated 下一篇: 回来转转 »
Joe @ 2006-08-18 11:04

在deque中内存是一块一块的分配的
#define _DEQUESIZ    (sizeof (_Ty) <= 1 ? 16 \
    : sizeof (_Ty) <= 2 ? 8 \
    : sizeof (_Ty) <= 4 ? 4 \
    : sizeof (_Ty) <= 8 ? 2 : 1)    /* elements per block (a power of 2) */
_DEQUESIZ定义了每一块的大小,每次超出边界时会分配一个新的block
这样做的优势在于无需因内存的大小不够而进行大量的数据拷贝。对内存的使用上也会更加符合需求,不会浪费大量未使用的内存。
这样做在查询的时候会比较不方便一点,所以在_Deque_const_iterator中作了特殊的处理,在查询效率上会有所下降。

在vector中当出现空间不够时,会以50%的增长率去分配内存。同时会将原来的内容拷贝到新的区域。这样会降低插入的性能。当时如果预先reserve了足够的区域,则效率会大大高于deque。同时在查询时由于是连续的存储区域,效率也会高于deque。
这是插入时内存不足时的处理方式。
_Capacity = max_size() - _Capacity / 2 < _Capacity
                ? 0 : _Capacity + _Capacity / 2;    // try to grow by 50%
            if (_Capacity < size() + _Count)
                _Capacity = size() + _Count;
            pointer _Newvec = this->_Alval.allocate(_Capacity);
            pointer _Ptr = _Newvec;

            _TRY_BEGIN
            _Ptr = _Umove(_Myfirst, _VEC_ITER_BASE(_Where),
                _Newvec);    // copy prefix
            _Ptr = _Ufill(_Ptr, _Count, _Tmp);    // add new stuff
            _Umove(_VEC_ITER_BASE(_Where), _Mylast, _Ptr);    // copy suffix
            _CATCH_ALL
            _Destroy(_Newvec, _Ptr);
            this->_Alval.deallocate(_Newvec, _Capacity);
            _RERAISE;
            _CATCH_END
这里有一个从外部分析的文章    http://dev.csdn.net/article/48/article/48/48881.shtm




评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定

网志分类
· 所有网志 (46) · 算法 (4) · C++ (7) · 随笔 (16) · Java (1) · javascript (3) · 编程开发 (9) · Python (4) · 未分类 (2) ·
站内搜索
友情链接
· 我的歪酷 非非共享界 · Realdodo · Bruce Eckel

订阅 RSS

0018592

歪酷博客