试图了解gzbuffer
在zlib中的用法。摘自手册(https://www.zlib.net/manual.html):
ZEXTERN int ZEXPORT gzbuffer OF((gzFile file,unsigned size));
设置此库的功能使用的内部缓冲区大小。默认缓冲区大小为8192字节。必须在gzopen()或gzdopen()之后以及任何其他读取或写入文件的调用之前调用此函数。缓冲存储器分配始终推迟到第一次读取或写入。分配了缓冲区空间大小的三倍。较大的缓冲区大小(例如64K或128K字节)将显着提高解压缩(读取)的速度。
新的缓冲区大小也会影响gzprintf()的最大长度。
gzbuffer()成功返回0,失败则返回–1,例如调用得太晚。
因此分配了三倍的缓冲区大小。当我调用gzwrite
时,是将压缩数据写入缓冲区(每次调用gzwrite
都进行压缩)还是将未压缩数据写入缓冲区? (然后压缩被延迟,直到缓冲区被填满并且内部调用gzflush
或我自己调用gzflush
为止)
当我继续调用gzwrite
时,缓冲区已满怎么办?此时是否有一些新的缓冲内存分配,还是只是将缓冲区刷新到文件然后重新使用?
答案 0 :(得分:0)
读取时,分配了size
输入缓冲区,并分配了2*size
输出缓冲区。写作时,是一样的,但是相反。
如果len
中的size
小于gzwrite(state, buf, len)
,则提供的数据将进入输入缓冲区。该输入缓冲区一旦累积了size
个字节,便会被压缩。如果len
大于或等于size
,则压缩缓冲区中剩余的内容,然后压缩所有提供的len
数据。如果请求刷新,则将输入缓冲区中的所有数据压缩。
压缩数据累积在size
输出缓冲区中,每次累积size
个压缩字节时,或者刷新或关闭gzFile
时,都会写入压缩数据。