我可以将 zlib 的 z_stream 重复用于多个操作吗?

can I reuse zlib's z_stream for several operations?

我目前正在玩 zlib

通常的例子大致如下(C/C++伪代码)

z_stream zs;
memset(&zs, 0, sizeof(zs));

if (deflateInit(&zs, Z_DEFAULT_COMPRESSION) != Z_OK)
    return false;

zs.next_in  = input_data;
zs.avail_in = input_size;

zs.next_out  = output_data;
zs.avail_out = output_size;

int result = deflate(&zs, Z_FINISH);

deflateEnd(&zs);

return result == Z_STREAM_END ? true : false;

使用 valgrind 我发现 deflateInit 和 memset 不完全是 "free" 操作,但需要相当长的时间。

我的问题是,我可以重复使用 z_streamdeflateInit 吗?
例如我可以通过更新缓冲区多次放气吗?

正在查看the man

[...]The first thing we do is to initialize the zlib state for compression using deflateInit(). This must be done before the first use of deflate(). [..]

强调我的

关键词是第一次使用前。只要下一次通缩使用相同的配置,就可以调用一次。

此外

[...]If there is an error in reading from the input file, the process is aborted with deflateEnd() being called to free the allocated zlib state before returning the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called at any time after the state has been initialized. Once that's done, deflateInit() (or deflateInit2()) would have to be called to start a new compression process.[...]

强调我的

是的。您可以使用 deflateReset() 获得与 deflateEnd() 后接 deflateInit() 相同的效果,但完全避免了代价高昂的取消和重新分配。