gpt4 book ai didi

c++ - 从套接字读取到缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:34 24 4
gpt4 key购买 nike

这个问题看似简单,但我认为它不是那么微不足道。或许我想多了,但我仍然想知道。

假设我们必须从 TCP 套接字读取数据,直到遇到一些特殊字符。数据必须保存在某个地方。我们不知道数据的大小,所以我们不知道我们的缓冲区有多大。在这种情况下有哪些可能的选择?

  1. 使用realloc 在更多数据到达时扩展缓冲区。这种方法会引发一些问题。使用 realloc 对性能有何影响?它可能会四处移动内存,因此如果缓冲区中有大量数据(并且可能有很多数据),我们将花费大量时间来四处移动字节。我们应该将缓冲区大小扩展多少?我们每次都加倍吗?如果是,所有浪费的空间怎么办?如果我们稍后以较小的大小调用 realloc,它会截断未使用的字节吗?

  2. 以恒定大小的 block 分配新缓冲区并将它们链接在一起。这与 C++ 标准库中的 deque 容器非常相似,允许快速附加新数据。这也有一些问题,比如我们应该把 block 做成多大以及如何处理未使用的空间,但至少它具有良好的性能。

您对此有何看法?这两种方法哪种更好?也许还有其他一些我没有考虑过的方法?

附言:

就我个人而言,我更倾向于第二种解决方案,因为我认为如果我们“回收” block 而不是每次需要 block 时都进行动态分配,它可以做得非常快。我能看到的唯一问题是它会损害局部性,但我认为这对我的目的(处理类似 HTTP 的请求)来说并不是特别重要。

谢谢

最佳答案

我更喜欢第二个变体。您也可以考虑仅使用一个原始缓冲区并在从套接字接收另一束数据之前处理接收到的数据,即在遇到特殊字符之前开始处理数据。

在任何情况下,我都不推荐使用原始内存和 realloc,而是使用具有自己重新分配的 std::vector,或者使用 std::array 作为固定大小的缓冲区。

您可能还对 Boost.Asio 的 socket_iostream 感兴趣,它在原始缓冲区之上提供了另一个抽象层。

关于c++ - 从套接字读取到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759802/

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