c程序中特定函数的内存使用情况

Posted

技术标签:

【中文标题】c程序中特定函数的内存使用情况【英文标题】:memory usage of a particular function in c program 【发布时间】:2021-09-25 02:56:59 【问题描述】:

我正在用 c 语言做一个数据结构项目,在这个项目中我一直在使用一些函数,比如在树中插入、从树中删除、在树中查找特定值。我必须计算每个单独函数的内存使用情况,例如插入函数、删除函数等中的内存使用情况。如果有任何库或内置函数来计算内存使用情况,请指导我。我发现了一些内容,比如查找整个程序的内存使用情况,但我关心的是特定功能的内存使用情况。

【问题讨论】:

我认为这项任务的目标是让您也查看源代码并从代码中找出内存使用情况。就像时间复杂度分析一样,只是为了记忆。 AFAIK 没有库或内置函数可以做到这一点。但我可以建议您将自己的mallocfree(和其他使用的内存函数)重写为包含分配/释放内存的字节计数器的包装函数。像这样的东西:void *my_malloc(size_t s) used_bytes_counter+=s; return malloc(s); 所说的问题太模糊了。例如,是否要询问插入函数为插入节点分配了多少内存?或者问插入函数在查找插入节点的位置时访问了多少内存?或者插入函数使用多少堆栈空间?老师们不会突然问这些问题;它们来自先前的课程和背景,可以清楚地说明问题。 【参考方案1】:

您的问题含糊不清,但我会尽量按照我理解的方式回答。 为具有 20 个节点的树分配的内存将消耗 20xNode 大小,因此假设我们的节点如下所示:

typedef struct node 

    int val;
    struct node * next;
 node_t;

假设您有一个 64 位系统,那么一个整数将占用 4 个字节,而一个指针将占用另外 8 个字节。节点大小将是 12 字节的已分配内存可供使用。 对于我们的示例,具有 20 个节点的树将消耗 240 字节的内存。 当您将节点添加到树中时,您基本上会增加存储的内存,从而扩大内存使用量。 如果您需要检查每个函数使用了多少内存,您应该分别计算每个函数的使用情况(请记住,每个函数都将变量存储在本地而不是全局)并在进程中添加总体分配或释放的内存。 假设一个添加节点的函数如下所示:

void addNode(node_t *leaf, int a)

  node *new=malloc(sizeof(node));
  new->val=a;
  new->next=NULL;
  *leaf->next=new;

此函数将为您的整体内存使用量增加 12 个字节。 您可以在主函数中添加一个计数器来跟踪存储的内存,并在添加结束时通过指针将 sizeof(node) 添加到计数器或从中减去。

如果我理解您的问题,您不需要跟踪本地内存,因为它在函数结束后并不重要。您只需要跟踪在为您收到的树进行初始分配后添加或减少的内存即可。

据我所知,没有可以为您执行此操作的功能,因此您必须自己添加它。 我对您的建议是将您的程序分解为许多小功能,并在每个功能结束时跟踪它对存储的整体内存所做的事情。 您还可以跟踪局部变量,但它们会在函数之间的每次转换时被删除(如果它们没有分配指针)。

【讨论】:

以上是关于c程序中特定函数的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

C#获取特定进程CPU和内存使用率

分析 C 应用程序中的最大内存使用情况 - linux

C语言动态内存

栈内存和堆内存

如何在 C++ 中获取 Windows 下的内存使用情况

有没有办法查看每个线程的进程的虚拟内存使用情况?