簡體   English   中英

C++ stream 至 memory

[英]C++ stream to memory

我如何創建std::ostreamstd::istream對象以指向我分配和管理的一塊 memory(我不希望 stream 釋放我的內存)。

我正在考慮使用rdbuf()->pubsetbuf()來修改其他流之一 - 比如sstringstream 但是我認為stringstream使用的 streambuf 之后會釋放緩沖區嗎?

基本上我正在嘗試將一些東西序列化為共享 memory。

謝謝。

看一下Boost.Interprocess庫中的bufferstream類:

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 

最小的 memory 緩沖區必須僅實現std::streambufoverflow function 並跟蹤 streambuf 的獲取指針 這是通過setppbump完成的。

您還需要添加一個底層 memory 緩沖區,但這可以很容易地完成。 cppreference.com 在已經提到的overflow頁面 function 中有一個基於std::array的實現的很好示例。雖然這是一個很好的學習開始,但您可能想要一個可以調整大小的 memory 緩沖區。 您可以嘗試基於std::vector實現它(就像我在這里所做的那樣)。

我最終基於std::realloc編寫了一個 memory 緩沖區以獲得最佳性能,同時也讓我有可能將原始指針移交給 C 庫。 你可以在這里找到我的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM