简要结论:readdir(及其相关函数)本身“吃”的内存并不大,主要取决于你一次读多少目录项、目录本身有多大、以及你用什么方式去读。
下面分几点说明(以 CentOS / Linux 通用情况为主)。
readdir 本身的内存占用很小在 glibc 中:
opendir 会打开目录并分配一个 DIR* 结构体(通常几十到几百字节)readdir 每次只返回一个 struct dirent *所以:
普通目录(几千个文件以内):
readdir几乎不耗内存
while ((entry = readdir(dir))) {
// 把文件名全部存起来
list_append(all_names, strdup(entry->d_name));
}
➡️ 这里不是 readdir 耗内存,而是你保存了结果
while ((entry = readdir(dir))) {
// 直接处理,不保存
process(entry->d_name);
}
readdir 相关的系统调用底层是:
getdents / getdents64内核行为:
fcntl / opendir 间接影响,但一般不需要readdir 高效readdir 不慢,但:
readdir不耗内存,耗内存的是“你把读出来的东西存下来”。
如果你愿意,可以告诉我:
我可以给你更具体的优化建议。