C++ 流式传输到内存

问题描述 投票:0回答:3

如何创建

std::ostream
std::istream
对象来指向我分配和管理的一块内存(我不希望流释放我的内存)。

我正在考虑使用

rdbuf()->pubsetbuf()
来修改其他流之一 - 比如
sstringstream
。但是我认为
stringstream
使用的streambuf会在之后释放缓冲区?

基本上我正在尝试将一些东西序列化到共享内存。

谢谢。

c++ stream
3个回答
8
投票

看一下 Boost.Interprocess 库中的 bufferstream 类:

缓冲流类提供 iostream接口直接 在固定大小的内存中格式化 具有缓冲保护的缓冲 溢出了。


1
投票
#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 

1
投票

最小内存缓冲区必须仅实现

overflow
std::streambuf
函数并跟踪streambuf指针。这是通过
setp
pbump
完成的。

您还需要添加底层内存缓冲区,但这可以相当容易地完成。 cppreference.com 在已经提到的

std::array
 函数页面中提供了一个基于 
overflow
的实现示例。虽然这是一个很好的学习开始,但您可能想要一个可以调整大小的内存缓冲区。您可以尝试基于
std::vector
来实现它(就像我在这里所做的那样)。

我最终编写了一个基于

std::realloc
的内存缓冲区以获得最大性能,同时也使我能够将原始指针移交给 C 库。您可以在here找到我的实现。

© www.soinside.com 2019 - 2024. All rights reserved.