2015-03-02 33 views
1

我有一些代碼,看起來大約是這樣的:如何禁用的boost ::通過一個過濾器鏈讀取時iostreams的緩衝

boost::iostreams::filtering_istreambuf in; 
in.push(Lz4DecompressionFilter()); 
in.push(AesDecryptionFilter()); 
in.push(file_source("somefile")); 

我已經有元數據存儲結果的長度:

std::vector<char> buf; 
buf.reserve(resultLength /* retrieved from a meta-data server */); 
std::streamsize ret = in.read(buf, buf.capacity); 

通過添加跟蹤點,我發現Lz4和Aes過濾器只能讀取128個字節的數據。另外,如果我用自定義設備替換file_source,它只能讀取4096字節。

由於我確切知道讀取的大小,有沒有辦法在iostream中完全禁用緩衝,只是將讀取的過濾器鏈接起來?我知道我可以緩衝區大小,但我有興趣完全禁用它們。

回答

0
  • 標準流按定義使用緩衝區抽象。這主要是因爲一些暴露的功能需要存在一個緩衝區(peek/putback)。

  • 如果沒有緩衝,壓縮和加密仍然會如何工作?壓縮和分組密碼都需要在(有時甚至是固定大小的)塊上操作。

  • 回覆:

    另外,如果我有一個自定義的設備更換file_source,它只是變得讀取的4096個字節。

    你會期望什麼樣的行爲呢?你期望無限大小的讀數?

  • 使用> 4k的塊在面向流的處理中非常不尋常。在那種情況下,只是想將所有輸入複製到一個大緩衝區中(可能使用array_sink ...)?

真的,它看起來像你只是想增加緩衝區大小是的。

+0

我明白了你的觀點。問題是,AES濾波器和LZ4濾波器都有相當複雜的緩衝要求,所以它們本身已經有了一些緩衝區。因此,我所有的讀取都已經發布了正確的緩衝區大小(和位置),我不希望進一步增加不必要的內存複製。 – user1202136 2015-03-02 17:29:12

+0

因此,最好的解決方案似乎是修改源的緩衝區大小以滿足您的需求 – sehe 2015-03-02 17:33:14

+0

我分享您對效率的興趣,事實上,我可能會考慮編寫一個結合了這些步驟的過濾器。在我的情況下,Boost Asio參與了,所以我使用了零拷貝預分配的緩衝區。無可否認,這個特定的項目陷入了原型模式:L – sehe 2015-03-02 17:52:12

相關問題