deflateBound () полезна только в том случае, если вы выполняете все операции сжатия за один шаг или если вы принудительно используете deflate, чтобы сжать все входные данные, доступные в данный момент для него, и создать сжатые данные для всего этого ввода. Это можно сделать с помощью параметра сброса, такого как Z_BLOCK, Z_PARTIAL_FLUSH и т. Д.
Если вы хотите использовать Z_NO_FLUSH, то становится гораздо труднее и неэффективно пытаться предсказать наибольшее количество выходных данных, которые deflate () может испустить при следующем вызове. Вы не знаете, сколько входных данных было использовано во время последнего пакета сжатых данных, поэтому вы должны предположить, что почти ничего из этого не произошло, при этом размер буфера увеличивался без необходимости. Однако вы пытаетесь оценить максимальную производительность, вы будете делать много ненужных malloc или reallocs без веской причины, которая неэффективна.
Нет смысла избегать вызова deflate () для большего вывода. Если вы просто зацикливаетесь на deflate () до тех пор, пока у вас больше не будет выходных данных, то вы можете использовать фиксированный выходной буфер, заблокированный один раз. Именно так был разработан интерфейс deflate () и inflate (). Вы можете посмотреть на http://zlib.net/zlib_how.html хорошо документированный пример использования интерфейса.
Кстати, в последней версии zlib (1.2.6) есть функция deflatePending (), которая позволяет узнать, сколько выходных данных ожидает от deflate ().