2014-09-28 33 views
6

我似乎无法找到什么使用()和提交()的真正含义的一个很好的解释,实际上我根本不理解streambuf。boost streambuf消耗和提交,它是什么

我的理解是streambuf只是一个字符数组。但为什么在文档中,

basic_streambuf::data 
Get a list of buffers that represents the input sequence. 

所以实际上有很多缓冲区?什么是“输入序列”和“输出序列”?这是另外两个缓冲区吗?

下面的代码实际上做了什么?

streambuf b; 
size_t size; 
size = read(socket, b.prepare(1024)); 
b.commit(size); 
size = write(socket, b.data()); 
b.consume(size); 

当我调用b.prepare()时,它是否为read()分配一个新缓冲区来放置数据?那么数据何时从该缓冲区传输到底层streambuf缓冲区?我认为这是提交(),但

basic_streambuf::commit 
Move characters from the output sequence to the input sequence. 

如此看来,实际上承诺从为“输入序列”的“输出序列”而没有提及用来存储数据的基础缓冲区移动数据!

回答

6

Boost ASIO streambuf不仅仅是一个字符数组。从basic_streambuf文档:

basic_streambuf类派生自std :: streambuf,以将streambuf的输入和输出序列与一个或多个字符数组关联。这些字符数组在basic_streambuf对象的内部,但是提供对数组元素的直接访问,以使它们可以有效地用于I/O操作。写入basic_streambuf对象输出序列的字符会附加到同一对象的输入序列。

该文档继续讨论可能的实施策略。 streambuf对象可以简单地使用单个连续的字符数组和指针来管理输入和输出序列。但接口允许更复杂的方案。

您问过代码片段实际做了什么,但这取决于底层的实现。简而言之,prepare()确保底层缓冲区足够大以容纳你正在尝试放入的缓冲区。它还使您可以通过mutuable_buffers对象访问缓冲区。一旦数据被写入streambuf(大概是,当读处理程序被调用时),commit()使得该数据可用于输入序列。你可以使用data()来访问这些字节。在完成缓冲区中的数据(因为您复制它,处理了它或其他内容)之后,consume()将从输入序列中删除数据。随后对data()的调用将不包含先前调用的字节。

您还声称用于存储数据的底层缓冲区从未被提及,这是正确的。由ASIO作者决定如何存储实际数据。

相关问题