基本的流缓冲区basic_streambuf::setbuf应该设置哪个缓冲区?

3
我正在开发一个basic_streambuf来处理从/到Winsock套接字的读写。就像basic_filebuf一样,我在内部使用std::codecvt对象将从底层套接字读取的字节转换为“套接字streambuf”的char类型,并将写入套接字streambuf的字符转换为可以写入底层套接字的字节。为了做到这一点,我发现需要维护读写功能的缓冲区。
逻辑问题是,streambuf实现旨在用于读写(std::iostream构造函数采用单个指向streambuf的指针),但只有一个可重载成员函数可用于自定义设置底层char缓冲区:setbuf。如果我想允许我的套接字streambuf模板的用户设置底层缓冲区,setbuf应该设置读缓冲区还是写缓冲区?哪种选项更合理?
2个回答

2
std::iostream继承自std::istreamstd::ostream,但这两者都从std::ios虚拟继承,而std::ios包含了缓冲区。由于它们都是从std::ios虚拟继承,所以std::iostream只有一个std::ios基类,因此只有一个内部缓冲区。

根据C++11的2011年2月草案:

§ 27.6.3

基类模板basic_streambuf用作派生各种流缓冲区的抽象基类,每个对象控制两个字符序列:
— 字符输入序列;
— 字符输出序列。

§ 27.7.2

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_istream : virtual public basic_ios<charT,traits> {

§ 27.7.3

namespace std {  
template <class charT, class traits = char_traits<charT> >  
class basic_ostream : virtual public basic_ios<charT,traits> {

1

标准流只有两种使用setbuf的指定行为。第一种是setbuf(0,0)可能没有任何效果,第二种是对于basic_filebuf,如果在任何IO之前调用setbuf(0,0),则IO是无缓冲的。否则结果是实现定义的。因此,只需根据您的实现进行合理操作,然后记录下来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接