如何创建
std::ostream
和 std::istream
对象来指向我分配和管理的一块内存(我不希望流释放我的内存)。
我正在考虑使用
rdbuf()->pubsetbuf()
来修改其他流之一 - 比如 sstringstream
。但是我认为stringstream
使用的streambuf会在之后释放缓冲区?
基本上我正在尝试将一些东西序列化到共享内存。
谢谢。
看一下 Boost.Interprocess 库中的 bufferstream 类:
缓冲流类提供 iostream接口直接 在固定大小的内存中格式化 具有缓冲保护的缓冲 溢出了。
#include <iostream>
#include <streambuf>
//...
size_t length = 100;
auto pBuf = new char[length]; // allocate memory
struct membuf: std::streambuf // derive because std::streambuf constructor is protected
{
membuf(char* p, size_t size)
{
setp( p, p + size); // set start end end pointers
}
size_t written() {return pptr()-pbase();} // how many bytes were really written?
};
membuf sbuf( pBuf, length ); // our buffer object
std::ostream out( &sbuf ); // stream using our buffer
out << 12345.654e10 << std::endl;
out.flush();
std::cout << "Nr of written bytes: " << sbuf.written() << std::endl;
std::cout << "Content: " << (char*)pBuf << std::endl;
//...
delete [] pBuf; // free memory
overflow
的 std::streambuf
函数并跟踪streambuf的指针。这是通过 setp
和 pbump
完成的。
您还需要添加底层内存缓冲区,但这可以相当容易地完成。 cppreference.com 在已经提到的
std::array
函数页面中提供了一个基于
overflow
的实现示例。虽然这是一个很好的学习开始,但您可能想要一个可以调整大小的内存缓冲区。您可以尝试基于std::vector
来实现它(就像我在这里所做的那样)。
我最终编写了一个基于
std::realloc
的内存缓冲区以获得最大性能,同时也使我能够将原始指针移交给 C 库。您可以在here找到我的实现。