我正在将内容从内存写入磁盘,以释放内存。
我不知道每次调用open()并将新元素追加到文件末尾时,会否将整个文件读入内存?还是只是指向文件末尾的指针?
最佳答案
如果您使用fstream
,ofstream::app
,ios::app
或ofstream::ate
模式打开文件,则ios::ate
实现未完全指定会发生什么。
但是在任何理智的实现中,都不会将文件读入内存,所有发生的就是fstream
实现将“当前位置”定位到文件末尾。
如果您的系统具有2GB的RAM,并且想要附加到大于2GB的文件,那么将整个文件读入回忆将是非常糟糕的。
由于过于花哨,在向文本文件中写入内容时,作为操作系统一部分的文件系统很可能会读取文件的最后几个(千字节)字节,因为大多数硬盘和类似的存储都需要数据正在写入固定大小的“块”(例如512字节或4千字节)。因此,除非当前文件大小恰好位于该块的边界,否则文件系统必须读取文件的最后一个块,并将其与您要求写入的其他数据一起写回。
如果您担心附加到非常大的日志文件中,则不,这不是问题。如果由于文件中有不想存储的 secret 数据而担心内存安全,那么可能会出现问题,因为其中的一部分可能会加载到内存中,您无能为力那。