2016-09-15 21 views
2

我目前在玩zlib我可以重複使用zlib的z_stream進行多個操作嗎?

通常的例子是多還是少,如下所示(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不完全「免費」的操作,但需要相當長的時間。

我的問題是,我可以重複使用z_streamdeflateInit
例如可以通過更新緩衝區多次放氣嗎?

+0

爲什麼不給自己一個測試呢? – wzona

+1

如果我測試它,並且它確實有效,但它並不意味着它是正確的。它可以將數據「添加」到先前的「部分」或其他東西。 – Nick

回答

3

是。您可以使用deflateReset()deflateEnd()後跟deflateInit()具有相同的效果,但完全避免了昂貴的拆分和重新分配。

+0

我希望你看到這個問題:) LPs回答添加一些信息的自動調用deflateEnd。 deflateReset在這之後安全嗎? InflateReset的情況是否一樣? – Nick

+1

沒有'deflateEnd()'的自動調用。在'deflateEnd()'之後你不能調用'deflateReset()'。是的,'inflateReset()'是相應的充氣呼叫。 –

+0

只需提一下,當我重置結構時,我的放氣功能增加了33%。 – Nick

2

看着the man

[...]我們做的第一件事是初始化zlib的狀態使用deflateInit壓縮()。 這必須在第一次使用deflate()之前完成。 [..]

重點礦山

的關鍵詞是第一使用之前。只要下一次放氣使用相同的配置,您可以調用一次。

此外

[...]如果在從輸入文件讀取錯誤,則處理被中止,並deflateEnd()被調用返回錯誤之前釋放分配ZLIB狀態。我們不想要內存泄漏,現在我們可以嗎? deflateEnd()可以在狀態初始化後隨時調用。一旦完成,必須調用deflateInit()(或deflateInit2())來啓動新的壓縮過程。 [...]

重點煤礦

+1

正確。通過查看zlib代碼,可以看出z_stream是在錯誤時完成的,在成功處理時可以重新使用該結構。 – wzona

+0

謝謝。由於某種原因,我沒有man page,我沒有在他們的網站上找到它。 – Nick

+0

我可能需要deflateReset – Nick

相關問題