考虑以下代码段:
static int const MAX = 1024; // limit on the number of directory entries
int actual = 0; // counter of directory entires
int ptrsize = sizeof(char*);
int i = 0;
char cwd[1024];
DIR* d;
struct dirent** buffer;
struct dirent** file;
getcwd ( cwd, sizeof ( cwd ) );
d = opendir ( cwd );
buffer = (struct dirent**)malloc(MAX * ptrsize); // allocate the large buffer
/* fill the buffer with dirents for each file in the cwd */
while ( ( buffer[actual] = readdir ( d ) ) != NULL ) actual++;
/* copy the active part of the buffer to the file array and free the buffer */
file = (struct dirent**)malloc(actual * ptrsize);
while ( i < actual ) {
file[i] = buffer[i];
i++;
}
free ( buffer );
使用自动虚拟内存以下列方式获得相同结果会更有效吗?
static int const MAX = 1024; // limit on the number of directory entries
int actual = 0; // counter of directory entires
char cwd[1024];
DIR* d;
struct dirent* file[MAX];
getcwd ( cwd, sizeof ( cwd ) );
d = opendir ( cwd );
while ( ( file[actual] = readdir ( d ) ) != NULL ) actual++;
如果目录中有10个文件,则不会使用1014个文件元素,因此几乎100%。由于虚拟内存将为其他目的回收空数组元素,它仍然会更有效吗?
答案 0 :(得分:0)
我会让你用你给我的记忆信息回答你自己的问题:
内存由不同的部分组成,在这里你讲的是2个:计算机提供的一个(映射的区域,如char cwd[1024]
)和你可以归属的那个(未映射的区域,如你的struct dirent** file;
),所有这些记忆都被放在了“头”上。
程序的最大内存在启动时分配。但它们是两种程序:基础程序和管理员程序。当第二个可以通过添加或抑制某些内存来修改头部时,第一个只能减少最大内存。所以,如果你有很多数据(或者有少量可用的内存),那么当你有一次这样的内存时,很难做2次内存分配。
理解malloc的一个很好的练习是尝试创建自己的malloc。这里有一个帮助:http://www.inf.udec.cl/~leo/Malloc_tutorial.pdf
而且,就我而言,如果我可以避免使用malloc,我就不会使用它,所以我对内存泄漏的关注度降低了。但是,这取决于每个人。