然而通过MSDN上一些前辈的讨论,得知List并没有真正导致内存泄漏,而是VS本身的 _CrtDumpMemoryLeaks()函数的执行位置的问题。
具体可以参考如下文章:
http://social.msdn.microsoft.com/Forums/da-DK/vclanguage/thread/cfafbb87-d4fb-4c8a-a89c-36c9d0d0bfc6
奇怪的是,如果把list换成vector或者queue,所有内存泄漏的问题都消失了。
list的push_back的实现会导致内部使用大量动态内存分配,而vector也会在动态增长连续内存长度的同时进行内存复制。
那么在需要大量push_back的情况下究竟哪个性能会比较好?
于是我做了如下测试。我做的是一个图形程序,程序运行的帧数可以很好的展示性能。
测试环境:
VS2008,Win7 64位,Intel i7处理器。
测试代码很简单,在每一帧渲染代码中只填写如下代码:
m_listTest.clear();
for (int i = 0; i < 100000; ++i)
{
int iTest;
m_listTest.push_back(iTest);
}
在debug模式下:
当m_listTest类型为list时,程序FPS只能达到5.
当m_listTest类型为vector时,程序FPS能达到20.
当m_listTest类型为queue时,程序FPS能达到20.
现在给代码加上迭代器的遍历逻辑,看效率如何:
m_listTest.clear();
for (int i = 0; i < 100000; ++i)
{
int iTest;
m_listTest.push_back(iTest);
}
for (list<int>::iterator it = m_listTest.begin(); it != m_listTest.end(); ++it)
{
int tets = *it;
}
在debug模式下:
当m_listTest类型为list时,程序FPS只能达到4.
当m_listTest类型为vector时,程序FPS能达到10.
queue没有迭代器,没有测试。
可见list在加上遍历逻辑后性能几乎没有受到影响,而vector性能降低到原来的一半。那么如果vector采用随机访问的形式呢?代码如下:
m_listTest.clear();
for (int i = 0; i < 100000; ++i)
{
int iTest;
m_listTest.push_back(iTest);
}
for (int it = 0; it < m_listTest.size(); ++it)
{
int tets = m_listTest[it];
}
在debug模式下,当m_listTest类型为vector时,该代码能使程序FPS达到19.也就是说,相对于插入操作,下标遍历的性能消耗几乎可以无视。这样的测试结果也很让我意外。我一直以为如果数据要做频繁的插入操作应该首选list。看起来queue是更好的选择。
是时候抛弃list了吗 ?...