c++性能优化系列(3) :STL 优化 1 年前 杨阳 C++ 开发关注虽然标准容器是为通用性和灵活性而设计的,但效率被牺牲了。 执行速度、内存经济性、缓存效率和代码大小都有损失。 1. vector 1.1 分配内存 优化思想:类似内存池,先统一预分配一块大的内存,避免后续昂贵的relocate。
第一个分支:看看内存池内的容量够不够,够的话直接拿走就好。 第二个分支:内存池不够20个块的容量,但是大于等于1个块的长度,就把剩下的都给出去了。此时,内存池是空的。 第三个分支:如果内存池连1个对应的块都不能提供了,比如需要32字节,但只有8字节了,这时候最好的做法是把这8个字节链接到相应的free l...
不出意料,此时内存池也是空的。 第四个分支:内存池空空如也,所以内存池求助于运行时堆,堆也没有那么多空间了,于是就检查这16个free list中有哪些块没用过呢,把这些补充到内存池。 第五个分支:没错,heap也无能为力了,内存池干脆直接调用***级配置器,因为***级配置器有new-handler机制,或许有机会释放其他...
与默认的“按需分配”方式不同,在使用基于内存池的分配器时,程序会预先为之分配大块内存(即“内存池”),而后在需要分配内存时,自定义分配器只需向请求方返回一个指向池内内存的指针即可;而在对象析构时,并不需实际解除分配内存,而是延迟到内存池的生命周期完结时才真正解除分配。这样不仅能减少内存碎片的产生也避...
2.3.4 内存池 前面提到,具体的内存申请工作是由 chunk_alloc() 函数完成的,而此函数会调用 malloc() 申请系统内存。 chunk_alloc() 函数每次调用 malloc() 会申请一大片连续内存,并维护两个指针,分别为 end_free 和 start_free,即指向内存的起始和结束区域。
这个allocator是一个由两级分配器构成的内存管理器,当申请的内存大小大于128byte时,就启动第一级分配器通过malloc直接向系统的堆空间分配,如果申请的内存大小小于128byte时,就启动第二级分配器,从一个预先分配好的内存池中取一块内存交付给用户,这个内存池由16个不同大小(8的倍数,8~128byte)的空闲列表组成,...
前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而是自己由留着用。 听到这些观点后,我就有些着急了,因为我以前一直是直接使用STL的一些工具类的,比如std::string、std::map、std::vector、std::list等等,从来都没有关注过内存的问题。
如图所示,可以看到 stl::allocator 内存空间消耗较大,只需要一个 32 字节的空间,就一次性申请了 1280 个字节,此时 640 字节的空间作为空闲链表,640 空间作为内存池备用。第二次申请 64 字节的空间 // 1、调用 _S_refill 函数 int __nobjs = 20; // 向 _S_chunk_alloc 申请 20 * 64 = 1280 空间 ...
STL内存池 一、STL中的内存管理 当我们new一个对象时,实际做了两件事情:(1)使用malloc申请了一块内存。(2)执行构造函数。在SGI中,这两步独立出了两个函数:allocate申请内存,construct调用构造函数。这两个函数分别在<stl_alloc.h>和<stl_construct.h>中。
SGI的std::alloc(全局共用一个内存池) 在我们敲下如下代码: Foo *pf =newFoo;deletepf; 其中的new有两阶段操作: 调用:: operator new配置内存 调用:: placement new构造对象 delete也有两阶段操作: 调用析构函数析构对象 调用:: operator delete释放内存 ...