我似乎无法找到消费()和提交()真正含义的一个很好的解释,实际上我根本不理解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缓冲区?我以为是commit(),但是
basic_streambuf::commit
Move characters from the output sequence to the input sequence.
所以似乎提交实际上是从'输出序列移动数据'输入序列'没有提到用于存储数据的底层缓冲区!
答案 0 :(得分: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作者决定如何存储实际数据。