У меня есть некоторый код, который выглядит примерно так:Как отключить повышение :: 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 байт.
Поскольку я точно знаю размер, который должны иметь чтения, существует ли способ отключить буферизацию в iostreams целиком и просто сцепить считывание фильтра? Я знаю, что размеры буфера могут быть change, но я заинтересован в их полном отключении.
Я вижу вашу точку зрения. Дело в том, что фильтр AES и фильтр LZ4 имеют довольно сложные требования к буферизации, поэтому у них уже есть несколько буферов. Следовательно, все мои чтения уже выпущены с правильным размером (и расположением) буфера, и я не хочу, чтобы ускорение делалось дальше, ненужное копирование памяти. – user1202136
Поэтому лучшим решением будет изменение размера буфера на источнике в соответствии с вашими потребностями. – sehe
Я разделяю вашу заинтересованность в эффективности, и, по правде говоря, я мог бы рассмотреть возможность создания фильтра, который объединяет здесь шаги. В моем случае был задействован Boost Asio, поэтому я использовал предустановленные буферы с нулевой копией. По общему признанию, этот конкретный проект застрял в режиме прототипа: L – sehe