C++中‘internal’与‘associated’流缓冲区有何区别?
C++中Internal流缓冲区与Associated流缓冲区的区别
作为经常和C++流打交道的开发者,我来给你梳理清楚这俩的核心差异——其实本质就是「自带私有缓冲区」和「当前工作缓冲区」的区别:
先搞懂两个核心概念
Internal流缓冲区
- 是
stringstream、fstream这类派生流类天生自带的私有缓冲区,从流对象构造的那一刻起就存在,属于流对象的一部分。 - 它的生命周期完全绑定在流对象上,只要流没被销毁,这个缓冲区就一直存在,谁也没法把它从流对象里“拿走”。
Associated流缓冲区
- 是流对象当前正在使用的工作缓冲区,可以把它理解成流的“现任搭档”。
- 默认情况下,像
stringstream这类流的associated缓冲区就是它自己的internal缓冲区,但你可以随时通过rdbuf()函数给流换个搭档。
核心区别对比
归属与生命周期:
- Internal缓冲区是流的“私有财产”,和流同生共死,不可被移除,只能间接操作其内容。
- Associated缓冲区是“临时工作伙伴”,可以随时切换,它的生命周期可能独立于流(比如你关联一个自己创建的外部缓冲区,流销毁后这个缓冲区还能继续用)。
可修改性:
- Internal缓冲区属于流对象的固有成员,你无法直接替换它,只能通过流的成员函数(比如
stringstream::str())修改它的内容。 - Associated缓冲区可以通过
rdbuf(streambuf* new_buf)轻松替换,替换后流的所有IO操作都会转向新的缓冲区。
- Internal缓冲区属于流对象的固有成员,你无法直接替换它,只能通过流的成员函数(比如
操作互不影响:
当你更换associated缓冲区后,流的IO操作只会用新的associated缓冲区,完全不会触动原来的internal缓冲区。比如你给fstream换了一个外部缓冲区,它原来用于读写文件的internal缓冲区依然完好,只是暂时被“闲置”了而已。
举个直观的代码例子
#include <sstream> #include <fstream> #include <iostream> int main() { // 创建一个stringstream,自带的internal缓冲区初始内容是"hello" std::stringstream ss("hello"); // 创建一个文件缓冲区,关联到test.txt std::filebuf file_buf; file_buf.open("test.txt", std::ios::out); // 把ss的associated缓冲区换成file_buf,同时保存原来的internal缓冲区指针 std::streambuf* original_internal_buf = ss.rdbuf(&file_buf); // 现在ss的输出会写入test.txt,而非自己的internal缓冲区 ss << " world"; // 换回原来的internal缓冲区 ss.rdbuf(original_internal_buf); // 输出internal缓冲区的内容,还是最初的"hello",完全没被刚才的写入影响 std::cout << ss.str() << std::endl; // 控制台输出hello file_buf.close(); return 0; }
内容的提问来源于stack exchange,提问作者Felix Dombek
相关产品推荐
相关产品推荐

