Zeromq抱怨c++ 第二篇,导致内存碎片化

September 01, 2012 | 0 Minute Read

http://www.250bpm.com/blog:8

前面第一篇说的c++的异常处理机制,这个说的面向对象的设计导致的内存碎片化。

都很有道理,我也是很赞同文章的观点的。

前段时间我也文章所说的list的删除和内存碎片问题。当时用 stl的list来做 队列,cancel操作的时候发现想把元素自身从队列删掉,c++的支持根本就不行,默认的删除是O(n)的,后来是就是按照 linux内存的list 自己实现了队列,也就是 文章所说的c方式的实现。再后来发现使用 iterator 也是可以做到 O(1)的删除的,并写了文章

http://gmd20.blog.163.com/blog/static/1684392320125145516797/

    但和zeromq作者说的那样,这种iterator的方式确实不够优雅。我的代码里面使用的linux 内核类似的 list,确实性能要比stl的list更适合应用场合吧, 这个c的list实现,在用性能工具分析采样的时候,确实非常的好,采样点几乎没有落到list的操作上,但其他的stl的容器的操作开销就有点大,采样可以看得出来。  这也可能是 zeromq作者说的 内存碎片导致的,指针和元素在内存上面是不连续的,影响缓存友好性。

    记得以前,c++之父的一个文档说,好像百万级元素的容易,从vector删除元素,比从list中删除要快就是这个道理。现在经常也发现,c++的容器或者某种封装类确实不容易控制内存的动态分配这些,比如boost::function 和 asio的异步调用,vector的复制,都可能会有动态内存分配,不容易控制。像在map<string,int> 里面 使用const char *作为key去查找时的string临时对象等。 确实也可能导致内存分块了,结果就是缓存不命中,程序性能下降。