1

我有一些看起来像这样的代码:

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 字节。

由于我确切地知道读取应该具有的大小,有没有办法完全禁用 iostreams 中的缓冲并将读取链接到过滤器?我知道我可以更改缓冲区大小,但我有兴趣完全禁用它们。

4

1 回答 1

0
  • 根据定义,标准流使用缓冲区抽象。这主要是因为某些暴露的功能需要存在缓冲区(peek/putback)。

  • 如果没有缓冲,压缩和加密如何仍然起作用?压缩和分组密码都需要对(有时甚至是固定大小的)块进行操作。

  • 回覆:

    此外,如果我用自定义设备替换 file_source,它只会读取 4096 字节。

    相反,您会期望什么行为?您期望无限大小的读取吗?

  • 在面向流的处理中使用大于 4k 的块是非常不寻常的。在那种情况下,是否只是想先将所有输入复制到一个大缓冲区中(可能使用array_sink...)?

真的,看起来你只是想增加缓冲区大小是的。

于 2015-03-02T13:17:56.223 回答