gpt4 book ai didi

c++ - STL 能否帮助解决内存碎片问题

转载 作者:行者123 更新时间:2023-11-28 00:27:18 24 4
gpt4 key购买 nike

这是关于正在开发的新 TCP 服务器(在 Windows/VC2010 上使用 C++)

成千上万的客户端连接并不断发送大量异步请求。我将传入的请求存储在原始链表(“C”型结构链表,其中每个结构都是一个请求)中,并在同步线程中一个一个地处理它们。

我正在使用 newdelete 来创建/销毁这些请求结构。

到目前为止,我对它最有效的方法印象深刻。但最近我发现即使在所有客户端断开连接后,服务器进程的 Private Bytes 仍然显示大量内存消耗(大约 45 MB),它再也没有恢复到原来的水平。

我仔细研究并确保没有内存泄漏。最后,我遇到了this并意识到这是因为大量 newdelete 调用导致的内存碎片。

现在我的几个问题是:

  1. 如果我用 STL 数据结构替换我的原始链表来存储传入的请求,它会帮助我摆脱内存碎片吗? (因为据我所知,STL 使用连续 block 。它自己的内存管理导致碎片非常少。但我不确定这是否属实。)

  2. 与原始链表相比,这种情况下的性能影响是什么?

最佳答案

我怀疑您的主要问题是您使用的是链表。链接列表对于这类事情来说是可怕的,并且会导致您所看到的问题。许多年前,我用普通的旧 C 编写了做非常相似事情的 TCP 代码。处理这个问题的方法是使用动态数组。您最终得到的分配要少得多。

在那些糟糕的过去,我自己动手,其实很简单。只需为一定数量的记录分配一个数据结构,比如十个。当你即将溢出时,将大小加倍,重新分配和复制。因为你以指数方式增加大小,你永远不会有超过少数的分配,使碎片成为一个非问题。此外,您没有列表带来的任何开销。

真的,几乎不应该使用列表。

现在就您的实际问题而言,是的,STL 应该可以帮助您,但不要使用 std:list。按照我刚才概述的方式使用 std:vector。根据我的经验,在 95% 的情况下,std:list 是次等的选择。

如果您使用 std:vector,您可能希望使用 vector::reserve 来预分配您希望看到的记录数。它会为您节省一些分配。

关于c++ - STL 能否帮助解决内存碎片问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24367493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com