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中完全禁用緩衝,只是將讀取的過濾器鏈接起來?我知道我可以緩衝區大小,但我有興趣完全禁用它們。
我明白了你的觀點。問題是,AES濾波器和LZ4濾波器都有相當複雜的緩衝要求,所以它們本身已經有了一些緩衝區。因此,我所有的讀取都已經發布了正確的緩衝區大小(和位置),我不希望進一步增加不必要的內存複製。 – user1202136 2015-03-02 17:29:12
因此,最好的解決方案似乎是修改源的緩衝區大小以滿足您的需求 – sehe 2015-03-02 17:33:14
我分享您對效率的興趣,事實上,我可能會考慮編寫一個結合了這些步驟的過濾器。在我的情況下,Boost Asio參與了,所以我使用了零拷貝預分配的緩衝區。無可否認,這個特定的項目陷入了原型模式:L – sehe 2015-03-02 17:52:12