如何有效地处理大型阵列的未使用部分:虚拟内存还是手动?

时间:2014-11-27 23:16:42

标签: c arrays performance memory-management

考虑以下代码段:

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%。由于虚拟内存将为其他目的回收空数组元素,它仍然会更有效吗?

1 个答案:

答案 0 :(得分:0)

我会让你用你给我的记忆信息回答你自己的问题:

内存由不同的部分组成,在这里你讲的是2个:计算机提供的一个(映射的区域,如char cwd[1024])和你可以归属的那个(未映射的区域,如你的struct dirent** file;),所有这些记忆都被放在了“头”上。

程序的最大内存在启动时分配。但它们是两种程序:基础程序和管理员程序。当第二个可以通过添加或抑制某些内存来修改头部时,第一个只能减少最大内存。所以,如果你有很多数据(或者有少量可用的内存),那么当你有一次这样的内存时,很难做2次内存分配。

理解malloc的一个很好的练习是尝试创建自己的malloc。这里有一个帮助:http://www.inf.udec.cl/~leo/Malloc_tutorial.pdf

而且,就我而言,如果我可以避免使用malloc,我就不会使用它,所以我对内存泄漏的关注度降低了。但是,这取决于每个人。