相关疑难解决方法(0)

Malloc vs自定义分配器:Malloc有很多开销.为什么?

我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统.在最初的一个中,malloc在任何地方使用,在第二个中,我实现了一个简单的池分配器,它只分配一块内存并将部分内存返回给myalloc()调用.

我们在使用malloc时注意到了巨大的内存开销:在内存使用的高度,malloc()代码需要大约170兆字节的内存用于1920x1080x16bpp映像,而池分配器只分配48兆字节,其中47由程序使用.

在内存分配模式方面,程序为测试映像分配了大量8字节(大多数),32字节(许多)和1080字节块(一些).除此之外,代码中没有动态内存分配.

测试系统的操作系统是Windows 7(64位).

我们如何测试内存使用情况?

使用自定义分配器,我们可以看到使用了多少内存,因为所有malloc调用都被赋予分配器.使用malloc(),在调试模式下,我们只需逐步执行代码并在任务管理器中查看内存使用情况.在发布模式下我们也做了同样的事情,但由于编译器优化了很多东西,所以我们无法逐步完成代码(发布和调试之间的内存差异大约为20MB,我将其归因于在发布模式下优化和缺少调试信息).

可以单独使用malloc是导致如此巨大开销的原因吗?如果是这样,究竟是什么原因导致malloc内部的开销?

c memory malloc

10
推荐指数
2
解决办法
5471
查看次数

Linux堆结构和malloc()和free()的行为

我有一个Debian的Linux 2.6内核,我试着去了解如何与堆工程/行为malloc()free().我试图搜索malloc()free()算法和堆结构,但我找不到任何有用的东西.不幸的是,我知道得少谈Linux和记忆是如何工作的,了解的源代码free()malloc().

这是一个示例代码:

int main(int argc, char **argv)
{
    char *a, *b, *c;

    a = malloc(32);
    b = malloc(32);
    c = malloc(32);

    strcpy(a, argv[1]);
    strcpy(b, argv[2]);
    strcpy(c, argv[3]);

    free(c);
    free(b);
    free(a);
}
Run Code Online (Sandbox Code Playgroud)

gdb,run AAAA BBBB CCCC我可以检查堆.这是在strcpys之前但之前的状态frees:

(gdb) x/32x 0x804c000
0x804c000:  0x00000000  0x00000029  0x41414141  0x00000000
0x804c010:  0x00000000  0x00000000  0x00000000  0x00000000
0x804c020:  0x00000000  0x00000000  0x00000000  0x00000029
0x804c030:  0x42424242  0x00000000  0x00000000  0x00000000
0x804c040: …
Run Code Online (Sandbox Code Playgroud)

c linux heap gdb memory-management

5
推荐指数
1
解决办法
8871
查看次数

标签 统计

c ×2

gdb ×1

heap ×1

linux ×1

malloc ×1

memory ×1

memory-management ×1