您可以通过观看Yandex团队的BoostCon演讲来了解此内容:一个基于Boost.Asio的网络服务器的优化。我的直觉告诉我,他们(Yandex团队)在这方面有点过度工程化。我认为根本的解决方案在于只使用预先分配的固定缓冲区(可能是每个线程),并使用Asio中的MutableBufferSequence概念将它们粘在一起。这种方法被称为Scatter-Gather,在Asio文档中只简要描述了一下。这里可能会有一个相关的示例:http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/examples/cpp11_examples.html#boost_asio.examples.cpp11_examples.buffers。正如@Nim已经评论的那样,默认情况下,Asio以“零拷贝”模式工作(因为它从不拥有缓冲区,也不代表调用者分配)。因此,它应该相当简单地使其工作。当然,内核/ libc函数是否以零拷贝方式实现完全取决于操作系统/平台。
boost::asio
是零拷贝的,它不会复制您通过它传递的缓冲区。然而,是否会通过 TCP 协议栈使用零拷贝操作是一个不同的问题。 - Nim