gpt4 book ai didi

c++ - 内存池和缓冲区 C++

转载 作者:可可西里 更新时间:2023-11-01 17:59:38 28 4
gpt4 key购买 nike

我有几个关于缓冲区和内存池的问题,我想得到解答。

假设我有一个服务器,每秒发送和接收 ~50-100+ 条消息。所有消息都有各种大小。您将如何着手充分利用此处的内存管理?我最初的计划是使用固定大小的缓冲区节点,并将它们合并在一起,例如:

struct buffer{
uint8_t data[512];
uint32_t end;
buffer* next;
}
buffer* b = pool_get_new_buffer();

因此,当发送一条消息时,我会根据大小创建一个或多个缓冲区并将它们链接在一起。这样我就不用担心池中的碎片了。 (或者至少我是这么认为的)。但是在小消息上,这是浪费空间。

但是看的越来越多,上网查代码,好像根本就没有人用这种方法。那么什么是更好的方法呢?根据消息大小从池中分配内存?

编辑:因此,我在此之后可能是对不同方法进行更深入的比较。

如果我使用链式缓冲区方法,我猜我会将碎片保持在最低水平,但另一方面我猜想对链中的每个缓冲区执行 memcpy 也是有代价的。但话又说回来,分配足够大的缓冲区并执行单个 memcpy 肯定也有其缺点,尽管大多数人无论如何都会选择这种方法。

最佳答案

如果只有一个缓冲区,比如大小为 0.5/1MB,怎么样?这显然取决于目标操作系统/设备以及可能的最大消息大小。此外,让您的服务器包含数据包大小。假设您的数据包没有超过单个缓冲区大小,您可以将数据下载到缓冲区中,对其进行处理,然后将内存标记为可用。我已将这种方法用于单个客户端-服务器应用程序。

关于c++ - 内存池和缓冲区 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15724497/

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