我在linux上使用fopen/fread/fwrite/fseek和gcc。在使用数据之前,是否有必要分配内存缓冲区并使用fread将数据按顺序读入缓冲区?
最佳答案
当您使用c标准库中的fread
或其他文件i/o函数时,内存会缓冲在几个地方。
应用程序分配一个缓冲区,该缓冲区被传递到fread
。fread
将数据复制到缓冲区中,然后就可以随心所欲地使用它了。您负责分配/释放此缓冲区。
C库通常会为您打开的每个FILE*
创建一个缓冲区。数据以大块的形式读入这个缓冲区。这允许fread
满足许多小的请求,而不必进行大量的系统调用,这很昂贵。这就是人们说fread
是缓冲的意思。
内核还将缓冲正在磁盘缓存中读取的文件。这减少了read
系统调用所需的时间,因为如果数据已经在内存中,那么当内核从磁盘获取数据时,程序就不必等待。内核将保留最近读取的文件,并且它可以读取正在按顺序访问的文件。
C库缓冲区在打开文件时自动分配,在关闭文件时释放。你根本不需要管理它。
内核磁盘缓存存储在物理内存中,不用于任何其他用途。再说一次,你不必管理这个。一旦需要其他东西,内存就会被释放。
关于c - 由于“读取”会加倍,是否有必要将数据读取到内存中然后使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9584276/