当我打开一个文件时会发生什么(RAM 和 ROM 很重要)

Tam*_*ero 4 c file-io fopen pointers memory-management

我想到这个问题是因为我想加快我的程序。

我从文件中读取数据,并像往常一样使用经典的:

FILE *fp;
fp=fopen("c:\\test.txt", "r");
Run Code Online (Sandbox Code Playgroud)

FILE 指针包含一个我不太理解的结构。

主要问题是:当我执行时,fopen我以某种方式将文件放入 RAM 中,或者每次我使用文件指针时,它都会从 HD 中读取文件?

操作系统:Linux Mint、gcc 编译器

Som*_*ude 5

返回的指针是指向黑盒结构的指针。您不应该了解实际的结构,而只需了解如何使用指向它的指针。

至于发生了什么,该fopen函数动态分配该结构(例如通过malloc)并返回一个指针。该结构存储在虚拟内存中,虚拟内存可能位于 RAM 或交换区中(如果启用了交换区)。指针本身存储在编译器存储变量的位置(例如堆栈上的局部变量,其他位置的全局变量)。无论变量存储在哪里,它都像结构一样存储在虚拟内存中,只是在另一个地方。

然后是文件处理操作。默认情况下,所有文件流都是缓冲的,这意味着当您尝试从文件流中读取任何内容时FILE,您调用的函数将读入私有缓冲区,并返回该缓冲区的一部分(或者如果您想要的话,可以返回多个缓冲区副本)读取的内容超出了内部缓冲区可以容纳的内容)。这个缓冲区也存储在虚拟内存中,不知道在哪里。

在较低级别,操作系统也有自己的缓冲,但它存储在操作系统私有的内存中。操作系统甚至可能有多个缓冲区。

至于所有这些缓冲区的存储位置,不管是在物理 RAM 中,还是在物理 RAM 中,但这并不在您的控制之下,而且对于作为应用程序程序员的您来说并不重要。您创建自己的缓冲区,要求fread用文件中的数据填充它,这就是作为初学者真正需要知道的一切。