我使用 boost::asio
作为网络框架。它使用 boost::asio::streambuf
作为读写介质。我想要:
- 在一个缓冲区中读取一些消息
- 将第二个缓冲区附加到第一个缓冲区的开头
- 发送新的组合消息
有哪些可能的高效(零拷贝)选项来完成这个任务?
我使用 boost::asio
作为网络框架。它使用 boost::asio::streambuf
作为读写介质。我想要:
有哪些可能的高效(零拷贝)选项来完成这个任务?
这个原理被称为“散布/聚集IO”。它基本上是一种同时传输多个缓冲区(按顺序)的方法,而不需要昂贵的内存复制。在boost::asio中,它得到了很好的支持,使用了非常灵活和强大的缓冲区概念和缓冲区序列概念(buffer-sequence concept),但这些概念也很难理解。
下面是一个简单的例子(未经测试,但我认为是正确的),可以帮助你入门:
std::vector<boost::asio::streambuf::const_buffers_type> buffers;
buffers.push_back( my_first_streambuf.data() );
buffers.push_back( my_second_streambuf.data() );
std::size_t length = boost::asio::write( mySocket, buffers );
当然,一个简单的选项是将两条消息都读入流缓冲区中,然后只需发送整个流缓冲区即可。但从你的问题中推断,由于某些原因,这似乎不是一个选择?